2017-10-26 19 views
0

以下は私のコードです。私はRecyclerViewcheckBox他のいくつかのcheckBoxがチェックされることを含むcheckBoxを選択するとRecyclerViewでのチェックボックスの選択の複製

holder.followDiseaseCheckBox.setOnClickListener(new View.OnClickListener() { 
     @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) 
     @Override 
     public void onClick(View view) { 

      if (holder.followDiseaseCheckBox.isChecked()) { 

       holder.followDiseaseCheckBox.setChecked(true); 

       checkBoxClicked++; 
       holder.followDiseaseCheckBox.setChecked(true); 
       // for Follow. 
       if (isFollowOrUnFollow.equals("FOLLOW")) { 

        ((FollowActivity) context).diseaseListFromAdapter.add(String.valueOf(diseaseMap.get("id"))); 
        ((FollowActivity) context).setFollowButton(true); 

       } 
       // for Unfollow. 
       else if (isFollowOrUnFollow.equals("UN_FOLLOW")) { 

        ((FollowTwoActivity) context).unFollowedDiseaseListFromAdapter.add(String.valueOf(diseaseMap.get("id"))); 
        ((FollowTwoActivity) context).setUnFollowDiseaseButton(true); 
       } 


      } else { 

       holder.followDiseaseCheckBox.setChecked(false); 

       checkBoxClicked--; 
       holder.followDiseaseCheckBox.setChecked(false); 
       // for Follow. 
       if (isFollowOrUnFollow.equals("FOLLOW")) { 
        ((FollowActivity) context).diseaseListFromAdapter.remove(String.valueOf(diseaseMap.get("id"))); 
       } 
       // for Unfollow. 
       else if (isFollowOrUnFollow.equals("UN_FOLLOW")) { 
        ((FollowTwoActivity) context).unFollowedDiseaseListFromAdapter.remove(String.valueOf(diseaseMap.get("id"))); 
       } 

       if (checkBoxClicked == 0) { 

        // for Follow. 
        if (isFollowOrUnFollow.equals("FOLLOW")) { 
         ((FollowActivity) context).setFollowButton(false); 
         ((FollowActivity) context).diseaseListFromAdapter.clear(); 
        } 
        // for Unfollow. 
        else if (isFollowOrUnFollow.equals("UN_FOLLOW")) { 

         ((FollowTwoActivity) context).setUnFollowDiseaseButton(false); 
         ((FollowTwoActivity) context).unFollowedDiseaseListFromAdapter.clear(); 
        } 
       } 
      } 

     } 
    }); 

問題です。しかし、adapterアイテムが正しく追加されていることを確認すると、checkBoxの選択が重複しています。

例:最初の項目checkBoxをチェックし、16番目の項目checkBoxをスクロールした場合もチェックされます。そのcheckBoxのチェックを外すと、最初の項目もチェックされなくなります。

答えて

1

リサイクラビューは、OnBindViewHolderのビューをリサイクルします。 アイテムがクリックされると、それは他のいくつかの位置に反映されます。 クリックした位置を格納するためのグローバルSparseBooleanArrayを作成するには

private final SparseBooleanArray array=new SparseBooleanArray(); 

最終的なビューホールダーの内側にclickListenerを追加し、クリックしたアイテムの位置をonClickストアします。チェックボックスの選択についての詳細な理解のために

public class ViewHolder extends RecyclerView.ViewHolder { 
    public YOURVIEW view; 
    public ViewHolder(View v) { 
     super(v); 
     view = (YOURVIEW) v.findViewById(R.id.YOURVIEWID); 
     view.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       array.put(getAdapterPosition(),true); 
       notifyDataSetChanged(); 
      } 
     }); 
    } 
} 

内部OnBindViewHolderで、

@Override 
public void onBindViewHolder(final ViewHolder holder, final int position) { 
    if(array.get(position)){ 
     holder.followDiseaseCheckBox.setChecked(true); 
    }else{ 
     holder.followDiseaseCheckBox.setChecked(false); 
    } 
} 
+0

ありがとうございます。その働き。 –

+0

あなたの大歓迎:) – Anonymous

2
public class CardViewDataAdapter extends RecyclerView.Adapter<CardViewDataAdapter.ViewHolder> { 
    private List<Student> stList; 
    public CardViewDataAdapter(List<Student> students) { 
     this.stList = students; 
    } 

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

    // create ViewHolder 

    ViewHolder viewHolder = new ViewHolder(itemLayoutView); 

    return viewHolder; 
} 

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

    final int pos = position; 

    viewHolder.tvName.setText(stList.get(position).getName()); 

    viewHolder.tvEmailId.setText(stList.get(position).getEmailId()); 

    viewHolder.chkSelected.setChecked(stList.get(position).isSelected()); 

    viewHolder.chkSelected.setTag(stList.get(position)); 


    viewHolder.chkSelected.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
    CheckBox cb = (CheckBox) v; 
    Student contact = (Student) cb.getTag(); 

    contact.setSelected(cb.isChecked()); 
    stList.get(pos).setSelected(cb.isChecked()); 

    Toast.makeText(
     v.getContext(), 
     "Clicked on Checkbox: " + cb.getText() + " is " 
     + cb.isChecked(), Toast.LENGTH_LONG).show(); 
    } 
    }); 

} 

// Return the size arraylist 
@Override 
public int getItemCount() { 
    return stList.size(); 
} 

public static class ViewHolder extends RecyclerView.ViewHolder { 

    public TextView tvName; 
    public TextView tvEmailId; 

    public CheckBox chkSelected; 

    public Student singlestudent; 

    public ViewHolder(View itemLayoutView) { 
    super(itemLayoutView); 

    tvName = (TextView) itemLayoutView.findViewById(R.id.tvName); 

    tvEmailId = (TextView) itemLayoutView.findViewById(R.id.tvEmailId); 
    chkSelected = (CheckBox) itemLayoutView.findViewById(R.id.chkSelected); 

    } 

} 

// method to access in activity after updating selection 
public List<Student> getStudentist() { 
    return stList; 
} 
} 

、あなたがrecylerviewのいくつかの概念が欠落している場合があります。このlink

+0

@Shaido&alfakini - 関連する回答が既に掲載されていますが、私は同じ解決策には答えません。私はこれがコンセプトをクリアするのに役立つと思う。 –

+0

@MohammadMisbahリンクは将来切断される可能性があるので、回答自体に関連情報を含めることが望ましいです。情報が質問に答えない場合は、コメントとして投稿するか、既存の回答に情報を追加することができます。 – Shaido

+0

@ Shaido - そうです、確かに私は答えを更新します。 Thanxをレビューする。 –

1

に従ってください。事実、recyclerviewは9個のアイテムごとに同じビューをバインド/リサイクルします。ですから、これを避けるためには、あなたの活動にsetItemViewCacheSize()を使用してください。

例:

contactListAdapter = new ContactsListAdapter(ContactActivity.this, contactArrayList); 
     mRecyclerView.setItemViewCacheSize(contactArrayList.size()); 
     mRecyclerView.setAdapter(contactListAdapter); 

公共ボイドsetItemViewCacheSize(int型のサイズ)潜在的に共有リサイクル ビュープールに追加する前に保持するために、オフスクリーン ビューの数を設定します。オフスクリーンビューキャッシュは、添付されたアダプタ の変更を認識したままで、LayoutManagerがそれらのビューを再利用することを可能にします。 アダプターに戻ってそれらを再バインドする必要はありません。 パラメータ:size - 一般的なリサイクルビュープール

0
public class SuggestionListAdapter extends RecyclerView.Adapter<SuggestionListAdapter.SuggestionListViewHolder> { 

private List<Suggestion> mSuggestionList; 
private Context mContext; 



public class SuggestionListViewHolder extends RecyclerView.ViewHolder{ 
    private CheckBox mCheckBox; 
    private LinearLayout mParent; 


    public SuggestionListViewHolder(View itemView) { 
     super(itemView); 
     mCheckBox = (CheckBox)itemView.findViewById(R.id.list_display_checkbox); 
     mParent =(LinearLayout)itemView.findViewById(R.id.list_parentll); 
    } 
} 

public SuggestionListAdapter(List<Suggestion> suggestionList, Context context) { 
    this.mSuggestionList = suggestionList; 
    this.mContext = context; 
} 

@Override 
public SuggestionListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View new_suggestion_list_view = LayoutInflater.from(parent.getContext()).inflate(R.layout.suggestion_list,parent,false); 
    return new SuggestionListViewHolder(new_suggestion_list_view); 
} 
@Override 
public void onBindViewHolder(final SuggestionListViewHolder holder, final int position) { 

    final Suggestion suggestion = mSuggestionList.get(position); 

    holder.mCheckBox.setText(suggestion.getCategory()); 
    holder.mCheckBox.setOnCheckedChangeListener(null); 
    holder.mCheckBox.setSelected(suggestion.isSelected()); 
    holder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if(isChecked){ 
       suggestion.setSelected(true); 
      }else { 
       suggestion.setSelected(false); 
      } 
     } 
    }); 
    holder.mCheckBox.setChecked(suggestion.isSelected()); 
} 

@Override 
public int getItemCount() { 
    return mSuggestionList.size(); 
} 

}

この例を見ているに それらを返す前にオフスクリーンキャッシュするビューの数私はあなたがどこにいるあなたがたと確信しています間違いを犯して問題を解決することができます。

関連する問題