2016-09-27 52 views
0

我有一个RecyclerView,每个元素代表一个事件。我想让用户通过点击来选择事件。一旦选定,事件和报告按钮将被着色:RecyclerView中的选定项目在滚动上发生变化

执行点击之前的UI:click here

用户界面执行点击后:click here

这很简单,据称工作;我为每个ViewHolder设置了一个OnClickListener,它负责为物品着色,当它被触发时,它将触发名为onOccurrenceSelected的拥有活动中的另一个事件,该活动负责更改按钮的状态。

但是,当滚动浏览RecyclerView的项目时,其他不相关的项目会被触发(尽管不是这样),并且当向后滚动选定的事件时颜色为未选中状态。当发生这种情况时,唯一应该着色项目的事件不会被触发。

这种行为的任何解释?谢谢!

编辑:这里是从适配器的一些相关代码:

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); 
     } 
    }); 
} 
+0

显示您的适配器代码 –

+0

@SarthakMittal补充说。 –

+0

在您的适配器类中覆盖此方法 - @Override public int getItemViewType(int position){ return position; } – musica

回答

1

Recyclerview总是resuse景色,而滚动,所以你必须存储选择的位置到临时ArrayList中,然后保持状态检查到onBindViewHolder这是否是数组列表中是否已存在特定的位置?我更新了你的adaper。在onBindViewHolder设置标签到您的项目适配器

holder.yourItem.setTag(position); 

找到评论

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); 
      } 
     }); 
    } 
+0

如何在'onClick'中获得视图的位置? –

+0

@NeriaNachum:您可以通过将标记设置为itemview来获取它。我更新了代码。再次审查! – Jai

+0

我是通过从'OnBindViewHolder'传入来实现的,它工作。谢谢! –

0

尝试下面的更改,然后将onClickListener内,只要保存在共享县那个位置。如果选择了,那么无论何时设置适配器,在设置值之前,只要根据共享的Pref检查它是否被选中即可。并执行相同的操作。

public void onClick(View view) { 
    if (!occurrence.isSelected()) { 
     //save position in share pref. 
    } 
} 
1

它是recyclerview的默认行为。它将回收/重新使用当前未使用的视图。如果您想保存已着色或未着色的状态。然后在每个位置保存一个参数到您的List<Object>。并根据onBindViewHolder方法中的位置使用该位置来更改颜色。

相关问题