我有带项目的RecyclerView。对于该RecyclerView,我正在创建我的自定义适配器。当我选择一行时,我会更改该视图的背景颜色。问题是,当RecyclerView有很多项时,当我单击一行时,应用程序会更改该视图的背景色,但它也会更改另一行的背景色。
我的适配器代码:
public class NarackiAdapter extends RecyclerView.Adapter<NarackiAdapter.MyViewHolder> {
private LayoutInflater inflater;
private List<TableItems> items = new ArrayList<>();
private List<TableItems> selected = new ArrayList<>();
public NarackiAdapter(Context context, List<TableItems> items) {
inflater = LayoutInflater.from(context);
this.items = items;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.one_item, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
final TableItems item = items.get(position);
holder.tvName.setText(item.getQuantity() + " " + item.getProducts().getName());
}
@Override
public int getItemCount() {
return items.size();
}
class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView tvName;
public MyViewHolder(View itemView) {
super(itemView);
tvName = (TextView) itemView.findViewById(R.id.tvName);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
if (getBackgroundColor(view) == R.color.primary) {
view.setBackgroundResoucre(R.color.light_gray);
selected.remove(items.get(getAdapterPosition()));
} else {
view.setBackgroundResoucre(R.color.primary);
selected.add(items.get(getAdapterPosition()));
}
}
}
}发布于 2016-09-02 22:29:52
您好,如果在您的onBindViewHolder()中选择了或没有选择,您必须执行更改颜色的逻辑,这也是因为回收器重用了相同的视图,并且您必须在那里更新它。滚动时,onBindViewHolder()将被触发,因此您需要检查是否选中了“在当前位置查看”。
编辑
如下所示:
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
final TableItems item = items.get(position);
//checkIfSelected(item) should check in your selected items array if this item exist there
if(checkIfSelected(item)){
//This will be the view that you want to update background
view.setBackgroundResoucre(R.color.primary);
}else{
//This will be the view that you want to update background
view.setBackgroundResoucre(R.color.light_gray);
}
holder.tvName.setText(item.getQuantity() + " " + item.getProducts().getName());
}发布于 2016-09-02 23:43:41
RecyclerView重用视图!因此,如果您更改了一个视图的backgroundColor,当RecyclerView重用该视图时,重用将具有相同的backgroundcolor。避免这种错误行为的方法是在bindViewHolder方法中实现持有者更改,因为每次重用视图时都会调用该方法。因此,bindViewHolder方法应该评估数据并决定如何显示视图。您的onClick函数应该编辑此数据并调用adapter.notifyItemChanged(itemPosition)或adapter.NotifyDataChanged()
https://stackoverflow.com/questions/39294511
复制相似问题