2016-09-27 95 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方法中的位置使用該位置來更改顏色。

相關問題