2016-09-27 24 views
0

私は各要素がイベントを表すRecyclerViewを持っています。私は、ユーザーがイベントをクリックして選択させたいと思っています。選択すると、イベントとレポートボタンの色が表示されます:RecyclerViewの選択項目がスクロール時に変更される

クリックする前のUI:click here

UIクリック後:click here

これはかなりシンプルであり、うまく機能しています。アイテムの色分けを担当するViewHolderごとにOnClickListenerを設定し、発生すると、ボタンの状態を変更する責任を負うアクティビティ(onOccurrenceSelected)で別のイベントがトリガーされます。 RecyclerViewのアイテムをスクロールするとき(それはなかったが)、そのOnClickListenerが起動し、そしてバックスクロールするとき、選択されたイベントを選択しないように着色されているよう

しかし、他の無関係な項目が着色されています。これが起こっている間、アイテムの色を付ける唯一のイベントはトリガーされません。

このような現象についての説明はありますか?ありがとう!

EDIT:ここでは、アダプタからのいくつかの関連するコードされていますので、スクロールしながら、あなたが一時的なのArrayListに選択された位置を格納する

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

アダプタクラスのこのメソッドをオーバーライドします。 - オーバーライド public int getItemViewType(int position){ return position; } – musica

答えて

1

Recyclerviewいつもは再使用景色を眺めることができますし、そのかどうかということonBindViewHolderに条件チェックを保ちます特定の位置はすでにarraylistに存在するかどうか?私はあなたの更新を更新しました。ただ、共有県でその位置を保存し、アダプタonClickListenerインサイド

holder.yourItem.setTag(position); 

そしてのonBindViewHolderにあなたの商品にタグを設定することにより、コメント

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:tagをitemviewに設定することで取得できます。私はコードを更新しました。もう一度レビューしてください! – Jai

+0

「OnBindViewHolder」から渡してやりました。ありがとう! –

0

てみてくださいと、以下の変更を見つけます。それが選択されている場合は、アダプタを設定した後で値を設定する前に、共有Prefに基づいて選択されているかどうかをチェックするだけです。同じアクションを実行します。

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

これは、recyclerviewのデフォルトの動作です。現在使用されていないビューをリサイクル/再利用します。色付きであるかどうかを保存したい場合。次に、位置ごとにList<Object>にパラメータを保存します。 onBindViewHolderメソッドの位置ごとに、その位置を使用して色を変更します。

関連する問題