您好我的片段中从我的适配器获取所有项目时遇到问题。更具体地说,我正在使用ScaleInAnimatorAdapter和我的客户适配器,当我尝试从下面发布的代码中获取我的复选框项目时,在我的片段中,我似乎只在屏幕上显示可见项目。
private View.OnClickListener onAllClick = new View.OnClickListener() {
@Override public void onClick(View v) {
int count = listAdapter.getItemCount();
for (int i = 0; i < count; i++) {
View mChild = listTopics.getChildAt(i);
if( mChild != null ) {
Log.d(TAG,"getItemCount(): " + i );
CheckBox cBox = (CheckBox)mChild.findViewById(R.id.topic_chk);
cBox.setChecked(((CheckBox) v).isChecked());
Log.d(TAG,"isChecked" + cBox.getTag());
cBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(((CheckBox) v).isChecked()) {
checkboxAll.setChecked(false);
}
}
});
}
}
}
};
基本上我正在尝试从片段创建一个check all all功能,这样当单击它时,将检查适配器中的所有复选框项。我得到了使用我提供的代码,但主要问题是我只能在屏幕上看到项目,所以当我滚动到我的其他项目时,他们不会被检查。因此,我想知道是否有更好的方法或其他方式让我获得所有项目
答案 0 :(得分:2)
适配器旨在将基础数据存储绑定到视图;它们通常不应该用于存储数据本身(除了为视图绑定目的提供数据副本),也不应该对数据执行操作。
相反,您应该修改基础数据,然后通过您已经使用的任何机制更新适配器。 (加载器,带有notifyDataItemChanged的自定义setter等)。
答案 1 :(得分:1)
基本上你不能。它将重用 UI视图。
您需要在所有数据列表对象中设置一个标志,调用notifyDataSetChanged()
和onBindViewHolder
检查该标志并使用它来检查取消选中
if(listAdapter.getItem(position).getIsChecked())
viewHolder.checkBox.setChecked(true);
else
viewHolder.checkBox.setChecked(false);
答案 2 :(得分:1)
确定。感谢所有回复的人,帮助我掌握了一些非常基本和重要的东西。
我得到了它的工作,所以对于任何可能阅读这篇文章的人来说,这是我的解决方案:
在适配器onBindViewHolder中,您将设置持有人复选框以与数据关联,如下所示:
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
obj.setSelected(buttonView.isChecked());
}
});
holder.checkBox.setChecked(obj.isSelected());
答案 3 :(得分:0)
你这样做错了。 您应该更新适配器,而不是更新复选框视图。
您可以做什么,您可以在适配器数据持有者中创建一个字段。
无论何时更改选择,只需更新字段或多个字段,最后刷新视图。