如何更改列表项目点击的项目外观。
在我的应用程序中,我有水平列表视图。在项目选择我想要更改选定的项目背景颜色和它的文本视图颜色。我已经想出了那部分。但是如何重置先前选择的项目的背景颜色和文本视图颜色。这是我的适配器类。如何更改列表项目点击的项目外观。
public class DateRangeListViewAdapter extends RecyclerView.Adapter<DateRangeListViewAdapter.ContentViewHolder> {
private ItemClickListener itemClickListener;
private LayoutInflater inflater;
private ArrayList<String> data;
private Context context;
private int dataType;
private int previousSelectedPosition;
private static final int DATE_TYPE = 1;
private static final int STATUS_TYPE = 2;
public DateRangeListViewAdapter(ArrayList<String> data, Context context,int dataType) {
this.data = data;
this.context = context;
this.dataType = dataType;
inflater = LayoutInflater.from(context);
previousSelectedPosition = -1;
}
public void setItemClickListener(ItemClickListener itemClickListener) {
this.itemClickListener = itemClickListener;
}
@Override
public ContentViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.custom_date_range_list_item,parent,false);
return new ContentViewHolder(view);
}
@Override
public void onBindViewHolder(ContentViewHolder holder, int position) {
String name = data.get(position);
holder.dateText.setText(name);
}
@Override
public int getItemCount() {
return data.size();
}
public class ContentViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private FrameLayout main;
private TextView dateText;
public ContentViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
main = (FrameLayout) itemView.findViewById(R.id.main_layout);
dateText = (TextView) itemView.findViewById(R.id.date_name);
}
@Override
public void onClick(View v) {
//Selected item color change
main.setBackground(ContextCompat.getDrawable(context,R.drawable.date_range_selected_item_background));
dateText.setTextColor(ContextCompat.getColor(context,R.color.colorPrimary));
if(itemClickListener!=null){
itemClickListener.onItemClick(v,this.getLayoutPosition(),dataType,getOldPosition());
}
}
}
public interface ItemClickListener{
public void onItemClick(View v, int position,int dataType,int oldPosition);
}
}
你基本上要利用好你的INT标志,previousSelectedPosition
,来跟踪被点击的列表项的位置,调用notifyDataSetChanged()
,然后设置标志作为条件语句的一部分内onBindViewHolder()
到相应地更新ViewHolder的视图,因为它们不断被绑定。请尝试以下变化:
ViewHolder的onClick():
@Override
public void onClick(View v) {
if (itemClickListener!=null) {
previousSelectedPosition = getAdapterPosition();
notifyDataSetChanged();
itemClickListener.onItemClick(v,this.getLayoutPosition(),dataType,getOldPosition());
}
}
RecyclerView.Adapter的onBindViewHolder():
@Override
public void onBindViewHolder(ContentViewHolder holder, int position) {
String name = data.get(position);
holder.dateText.setText(name);
if (previousSelectedPosition == position) {
main.setBackground(ContextCompat.getDrawable(context,R.drawable.date_range_selected_item_background));
dateText.setTextColor(ContextCompat.getColor(context,R.color.colorPrimary));
} else {
// TODO: Configure the FrameLayout and TextView here for initial runtime as well as back to default
}
}
...是的,一定要保持previousSelectedPosition
初始化为-1对于初始运行时只是这样onBindViewHolder()
条件不会影响直到标志更新(在点击一个列表项后,就是这样)。
感谢您的回答。它的工作有点怀疑,当调用'notifyDataSetChanged()'时,它不会重绘整个列表视图?如果是的话,这对性能来说并不是那么糟糕。我认为可能有办法按位置查找列表视图项,并在点击第二项时将其更改为默认设计。 –
@ChathurangaShanJayarathna notifyDataSetChanged()只更新当前屏幕上的列表项,而不是重建整个列表,所以不,它在内存中并不昂贵。至于你的问题,我敢肯定有一种方法,但是最好使用我的方法,因为更新由许多列表项(包括插入新行)组成的列表中的单个行的UI,比如说100行在屏幕外,导致一个错误,其中“每隔一个”列表项目也被更新。本教程视频可能会有所帮助:https://www.youtube.com/watch?v=Ntrf-sWSrNs – DaveNOTDavid
感谢您的帮助。 –
您的OnClickListener
不能正常工作。你只需要从你的“ItemClickListener”接口实现你的ViewHolder
。并在onCreateViewHolder
中添加以下行:
View view = inflater.inflate(R.layout.custom_date_range_list_item,parent,false);
ContentViewHolder cVh = ContentViewHolder(view);view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cVh.onItemClick(v,this.getLayoutPosition(),cVh .dataType,cVh .getOldPosition());
}
});return cVh
您应该在代码中指明需要重置背景的位置。 –
对项目点击查看里面'ContentViewHolder'视图持有者类 –
在设置背景和文本颜色之前调用'notifyDataSetChanged' –