2016-07-29 6 views
1

私はcustomrecycleAdapterを持っています。要素をクリックすると、行の色が変わりますが、スクロールして背景の変更位置を表示するか、他の要素に表示されます。 私はReceived of viewについて読んだことがありますが、この問題のためにworkoroundとは何ですか?スクロールRecycleAdapterとスクロールで要素の背景を繰り返します。

私のアダプタは次のとおりです。

public class CustomRecycleAdapter extends RecyclerView.Adapter<CustomRecycleAdapter.ViewHolder> { 
    private JSONArray dataSource; 
    private AdapterCallback mAdapterCallback; 
    public static SparseBooleanArray selectedItems; 

    public CustomRecycleAdapter(JSONArray dataArgs, Context context){ 
     dataSource = dataArgs; 
     this.mAdapterCallback = ((AdapterCallback) context); 


    } 



    public static interface AdapterCallback { 
     void onMethodCallback(View caller, JSONObject obj, JSONArray data, int position); 
    } 


    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     // create a new view 
     View view = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.list_view_activities, parent, false); 

     ViewHolder viewHolder = new ViewHolder(view, new CustomRecycleAdapter.ViewHolder.IMyViewHolderClicks() { 
      public void onClick(View caller, int position) { 
       try { 

        JSONObject itemClicked = dataSource.getJSONObject(position); 
        mAdapterCallback.onMethodCallback(caller, itemClicked, dataSource, position); 
//     Log.e("clicked", itemClicked.toString()); 

       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      }; 
     }); 

     return viewHolder; 

    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     try { 

      JSONObject object = dataSource.getJSONObject(position); 
      holder.textView.setText(object.getString("description")); 





     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

    } 
    @Override 
    public int getItemCount() { 
     return dataSource.length(); 
    } 

    public JSONObject getItem(int position) throws JSONException { 
     return dataSource.getJSONObject(position); 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 

     public IMyViewHolderClicks mListener; 
     public TextView textView; 
     public TextView hours; 

     public ViewHolder(View itemView, IMyViewHolderClicks listener) { 
      super(itemView); 
      mListener = listener; 
      textView = (TextView) itemView.findViewById(R.id.activity); 
      hours = (TextView) itemView.findViewById(R.id.hours); 
      itemView.setOnClickListener(this); 

     } 


     @Override 
     public void onClick(View v) { 
      int position = getAdapterPosition(); 
      Log.e("RecycleAdapterPosition", String.valueOf(getAdapterPosition())); 
//   mListener.onClick(v, position); 
      v.setBackgroundColor(Color.GREEN); 
      v.setSelected(true); 


     } 
     public interface IMyViewHolderClicks { 


      public void onClick(View caller, int position); 
     } 
    } 




} 

だから私は、要素をクリックし、corretly setBackgroundが、私はスクロールする場合、私は避難所、私が選択したことを、背景を持つ他の要素がsettedと私は私の要素をスクロールアップかどうかを確認しますバックグラウンド。

+0

呼び出されたときにそれらを確認してください。クリックすると、コントローラはモデル(つまり配列のインデックス)を更新する必要があります。更新されたモデルはモデル(カラー値)を使用して適切な背景色をレンダリングするビューレイヤ(つまりアダプタ) 。 – FishStix

答えて

0

RecyclerViewは表示されるリストの次の要素をペイントするためにビューを再利用します。したがって、新しいデータでビューセットを設定しますが、リストの他の要素が新しい色で表示されるため、

あなたは、この要素がチェックされているかどうかを保存する配列を作成しなければならないと確認した場合onBindViewHolder()はこれがモデルとビューの分離の利点です

@Override 
public void onBindViewHolder(final YourViewHolder holder, final int position) { 

    if(checked[position]){ 
     //YourViewHolder change colour 

    } 

} 
関連する問題