2017-02-10 11 views
-2

私は、成分のリストを取得してアダプタを生成するカーソルを持っています。アダプタは、チェックボックスを持つリサイクルビューに割り当てられます。私が持っている問題は、チェックボックスのセットをチェックしてスクロールダウンすると、トップから選択されたものが選択解除され、逆もまた同様です。場合によっては、3つを上から、3つを下から選択されます。最初は何も選択されていないことを確認する必要があります。また、上下にスクロールしても、選択されたものを選択したままにしておく必要があります。スクロール時にrecyclerViewのチェックボックスがオフになる

以下は、スクロール可能なリストです。ここで

enter image description here

私のコードです:

class RecipeDetailCursorAdapter extends CursorRecyclerViewAdapter<RecyclerView.ViewHolder> { 

    private int mBrownColor; 
    private int mGreenColor; 
    private int mCheckItems; 
    private ItemsCheckedCallback mCheckedCallback; 

    RecipeDetailCursorAdapter(Context context, Cursor cursor, ItemsCheckedCallback callback) { 
     super(context, cursor); 
     mCheckedCallback = callback; 
     mBrownColor = ContextCompat.getColor(mContext, R.color.colorTextBrown); 
     mGreenColor = ContextCompat.getColor(mContext, R.color.colorTextGreen); 
     mCheckItems = 0; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, Cursor cursor) { 
     String taskName = cursor.getString(cursor.getColumnIndexOrThrow(MascotHelper.RecipeTask.NAME)); 
     ((RecipeTaskHolder) viewHolder).bindView(taskName); 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.recipe_task_item, parent, false); 
     return new RecipeTaskHolder(v); 
    } 


    private class RecipeTaskHolder extends RecyclerView.ViewHolder 
      implements SmoothCheckBox.OnCheckedChangeListener { 

     SmoothCheckBox taskBox; 
     TextView recipeComponentName; 


     RecipeTaskHolder(View v) { 
      super(v); 
      taskBox = (SmoothCheckBox) v.findViewById(R.id.recipe_task_box); 
      recipeComponentName = (TextView) v.findViewById(R.id.recipe_component_name); 
      taskBox.setOnCheckedChangeListener(this); 
     } 


     void bindView(String task) { 
      recipeComponentName.setText(task); 
     } 

     @Override 
     public void onCheckedChanged(SmoothCheckBox smoothCheckBox, boolean b) { 
      if (smoothCheckBox.isChecked()) { 
       recipeComponentName.setTextColor(mBrownColor); 
       mCheckItems++; 
      } else { 
       recipeComponentName.setTextColor(mGreenColor); 
       mCheckItems--; 
      } 


      if (mCheckItems == getItemCount()) { 
       //Toast.makeText(mContext, "All items are checked", Toast.LENGTH_SHORT).show(); 
       mCheckedCallback.onAllItemChecked(true); 
      } else { 
       mCheckedCallback.onAllItemChecked(false); 
      } 
     } 
    } 


    interface ItemsCheckedCallback { 
     void onAllItemChecked(boolean status); 
    } 
} 

任意のアイデアや提案をいただければ幸いです。

答えて

0
@Override 
public void onBindViewHolder(MyViewHolder holder,final int position) { 
    final ClassName object = objectList.get(position); 
    object.checkBox.setOnCheckedChangeListener(null); 
    object.checkBox.setChecked(false); 
    object.checkBox.setOnCheckedChangeListener(new android.widget.CompoundButton.OnCheckedChangeListener() { 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      object.setChecked(isChecked); 
     } 
    }); 
} 

これは、ビューを継続的にバインドし、チェックされた位置を保持し、ビューがバインドされたときに何度もチェックし続けます。

希望すると、これが役立ちます。 onBindViewに以下

+0

うん申し訳ありませんが、私はコードの異なるバージョンを入れている、私は今、それを編集しました。 – HShbib

+0

解決策が見つかったら、私の解決策を確認済みのマークを付けてください。 –

+0

私のコードを使用してチェックを行い、問題のチェックを外してください –

1

使用ロジック:

holder.attenCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 
       if (holder.attenCheckBox.isChecked()) 
        dataModel.setChecked(true); 
       else 
        dataModel.setChecked(false); 
      } 
     }); 

     if (dataModel.getChecked()) 
      holder.attenCheckBox.setChecked(true); 
     else 
      holder.attenCheckBox.setChecked(false); 
     holder.checkboxLinearLayout.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       if (holder.attenCheckBox.isChecked()) 
        holder.attenCheckBox.setChecked(false); 
       else 
        holder.attenCheckBox.setChecked(true); 


      } 
     }); 

説明:あなたがアップスクロールダウンしたりするとき

  • リサイクルビューはeveytimeを膨らませます。
  • は、あなたはあなたがリスナーの後にフラグを置くenable/disable .make必ずチェックを持つことができますsetOnCheckedChangeListenerでそのフラグを使用してチェック状態
  • を追跡するためのデータPOJOにフラグを格納する必要があります。
+0

これが何を行い、あなたの答えを明確にするためにどのような変更がなされるのか、事前に感謝してください! –

+0

リサイクルビューを下にスクロールすると、eveytimeが膨らんでいきます。チェックポイントをチェックするには、setOnCheckedChangeListenerでフラグを使用して、データpojoにフラグを保存して、有効/無効をチェックすることができます。リスナー@KingReloadの後ろにフラグを立てておいてください。動作したらチェックしてください。 –

+0

あなたの答えはありがたいですが、それをあなたの答えに編集してください:)他のユーザーのために読むのが簡単になります;) –

関連する問題