我有一个RecyclerView,每个元素代表一个事件。我想让用户通过单击选择事件。选择后,事件和报告按钮将变为彩色:
进行点击之前的用户界面:点击此处。
用户界面执行单击后:单击此处。
这非常简单,并且据称有效。我OnClickListener为每个ViewHolder负责为项目着色的对象设置了一个,并在触发时触发了名为的拥有活动中的另一个事件,该事件onOccurrenceSelected负责更改按钮的状态。
OnClickListener
ViewHolder
onOccurrenceSelected
但是,滚动浏览RecyclerView的项目时,其他不相关的项目会像OnClickListener被触发一样被着色(尽管不是),而向后滚动时,选定的事件则被着色为未选中。发生这种情况时,不会触发应该为项目着色的唯一事件。
对这种行为有任何解释吗?谢谢!
编辑:这是适配器的一些相关代码:
private List<Occurrence> mDataSet; private Activity activity; public <OccurrencesActivity extends OnOccurrenceSelectedListener> OccurrencesAdapter(OccurrencesActivity occurrencesActivity, List<Occurrence> occurrences) { this.activity = (android.app.Activity) occurrencesActivity; mDataSet = occurrences; } @Override public void onBindViewHolder(final ViewHolder holder, final int position) { Occurrence instance = mDataSet.get(position); ... setOnClickListener(holder, instance); } private void setOnClickListener(final ViewHolder holder, final Occurrence occurrence) { holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (!occurrence.isSelected()) { holder.itemView.setBackgroundColor(App.getContext().getResources().getColor(R.color.turquoise)); holder.titleTextView.setTextColor(App.getContext().getResources().getColor(R.color.white)); holder.statusTextView.setTextColor(App.getContext().getResources().getColor(R.color.white)); holder.dateTextView.setTextColor(App.getContext().getResources().getColor(R.color.white)); holder.timeTextView.setTextColor(App.getContext().getResources().getColor(R.color.white)); } else { holder.itemView.setBackgroundColor(App.getContext().getResources().getColor(R.color.white)); holder.titleTextView.setTextColor(App.getContext().getResources().getColor(R.color.turquoise)); holder.statusTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey)); holder.dateTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey)); holder.timeTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey)); } occurrence.setSelected(!occurrence.isSelected()); ((OnOccurrenceSelectedListener)activity).onOccurrenceSelected(mDataSet); } }); }
Recyclerview总是在滚动时重用视图,因此您必须将选定的位置存储到临时arraylist中,然后将条件检查保持在onBindViewHolder中,以确保该特定位置是否已经存在于arraylist中?我更新了你的衣服。在评论中找到以下变化
private List<Occurrence> mDataSet; private Activity activity; //Added here temporary ArrayList private ArrayList<String> mSelectedPosition = new ArrayList<String>; public <OccurrencesActivity extends OnOccurrenceSelectedListener> OccurrencesAdapter(OccurrencesActivity occurrencesActivity, List<Occurrence> occurrences) { this.activity = (android.app.Activity) occurrencesActivity; mDataSet = occurrences; } @Override public void onBindViewHolder(final ViewHolder holder, final int position) { //Set ViewTag holder.itemView.setTag(position); //Check everyposition during view binding process if(mSelectedPosition.contains(String.valueOf(position))){ holder.itemView.setBackgroundColor(App.getContext().getResources().getColor(R.color.white)); holder.titleTextView.setTextColor(App.getContext().getResources().getColor(R.color.turquoise)); holder.statusTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey)); holder.dateTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey)); holder.timeTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey)); }else{ holder.itemView.setBackgroundColor(App.getContext().getResources().getColor(R.color.white)); holder.titleTextView.setTextColor(App.getContext().getResources().getColor(R.color.turquoise)); holder.statusTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey)); holder.dateTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey)); holder.timeTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey)); } Occurrence instance = mDataSet.get(position); ... setOnClickListener(holder, instance); } private void setOnClickListener(final ViewHolder holder, final Occurrence occurrence) { holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // Get Position int position = (int) view.getTag(); //Remove SelectedPosition if Already there if(mSelectedPosition.contains(position)) mSelectedPosition.remove(String.valueOf(position)); else mSelectedPosition.add(String.valueOf(position)); notifyDataSetChanged(); //Not sure about this lines occurrence.setSelected(!occurrence.isSelected()); ((OnOccurrenceSelectedListener)activity).onOccurrenceSelected(mDataSet); } }); }