Ram*_*gde 3 checkbox android recycler-adapter android-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();
}
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
问题是当我选择一个checkBox要检查的checkBox其他东西checkBox时RecyclerView。但是,当我签入adapter项目时,正确添加了项目,但checkBox选择却重复了。
例如:如果我选中了第一个项目checkBox并向下滚动,则第16个项目checkBox也会被选中。取消选中checkBox也会取消选中第一项。
回收者视图回收OnBindViewHolder中的视图。因此,当单击项目时,它会反映在其他一些位置。创建一个全局SparseBooleanArray来存储单击位置。
private final SparseBooleanArray array=new SparseBooleanArray();
Run Code Online (Sandbox Code Playgroud)
然后在最终的Viewholder中添加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();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
在OnBindViewHolder内部,
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
if(array.get(position)){
holder.followDiseaseCheckBox.setChecked(true);
}else{
holder.followDiseaseCheckBox.setChecked(false);
}
}
Run Code Online (Sandbox Code Playgroud)
您可能缺少recylerview的一些概念。事实是,recyclerview每9个项目绑定/回收一个相同的视图。因此,为了避免这种情况,请setItemViewCacheSize()在您的活动中加以利用。
例:
contactListAdapter = new ContactsListAdapter(ContactActivity.this, contactArrayList);
mRecyclerView.setItemViewCacheSize(contactArrayList.size());
mRecyclerView.setAdapter(contactListAdapter);
Run Code Online (Sandbox Code Playgroud)
public void setItemViewCacheSize(int size)设置要保留的屏幕外视图的数量,然后再将其添加到潜在的共享回收视图池中。屏幕外视图高速缓存始终了解连接的适配器中的更改,从而LayoutManager可以重用那些未经修改的视图,而无需返回适配器重新绑定它们。参数:size-将其返回到常规回收视图池之前要在屏幕外缓存的视图数
| 归档时间: |
|
| 查看次数: |
3448 次 |
| 最近记录: |