我是Android的新手,在我学习的过程中学到了很多东西。因此这个查询可能非常基本
我通过RecyclerViewAdapter显示复选框列表。一些复选框是选择整组复选框。我想要做的是,如果选中其中一个组复选框,我想检查该组中的所有复选框。
一切正常,直到我检查已经可见的框,但是当迭代器超出可见的那一刻时,我得到一个空的返回。
我使用过findViewHolderForAdapterPosition和getChildAt。两者都有同样的问题。无论如何我可以访问屏幕上尚未显示的盒子吗?
onCheckedChangedListener的相关部分在下面给出
private CompoundButton.OnCheckedChangeListener checkChangedListener = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
final HeaderListStructure structure = (HeaderListStructure) buttonView.getTag();
if (isChecked) {
if (structure != null) {
selectedRules.add(structure);
if (structure.type != Constants.TYPE_ITEM){
ArrayList<Object> temp = (ArrayList) structure.additionalInfo;
for (Object obj : temp){
int itr = (int) obj;
Log.d(TAG, "onCheckedChanged: Print out int" + itr);
RecyclerView checkbox = (RecyclerView) buttonView.getParent().getParent();
LinearLayout linearLay = (LinearLayout) checkbox.findViewHolderForAdapterPosition(itr).itemView;
CompoundButton buttonToSet= (CompoundButton) linearLay.getChildAt(0);
buttonToSet.setChecked(true);
}
}
}
} else {
Oncreate适配器代码在这里
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.child_add_mode_smart_rule, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
final HeaderListStructure structure = rulesListing.get(position);
if (structure.type == Constants.TYPE_ITEM) {
holder.itemView.setPadding(80, 20, 20, 20);
holder.itemView.setVisibility(View.VISIBLE);
if (Build.VERSION.SDK_INT >= 23) {
holder.itemView.setBackgroundColor(holder.itemView.getContext().getResources().getColor(R.color.white, null));
} else {
holder.itemView.setBackgroundColor(holder.itemView.getContext().getResources().getColor(R.color.white));
}
}else if(structure.type==Constants.TYPE_SUBHEADER2){
holder.itemView.setPadding(60, 20, 20, 20);
holder.itemView.setVisibility(View.VISIBLE);
if (Build.VERSION.SDK_INT >= 23) {
holder.itemView.setBackgroundColor(holder.itemView.getContext().getResources().getColor(R.color.background_color, null));
} else {
holder.itemView.setBackgroundColor(holder.itemView.getContext().getResources().getColor(R.color.background_color));
}
} else if(structure.type==Constants.TYPE_SUBHEADER) {
holder.itemView.setPadding(40, 20, 20, 20);
holder.itemView.setVisibility(View.VISIBLE);
if (Build.VERSION.SDK_INT >= 23) {
holder.itemView.setBackgroundColor(holder.itemView.getContext().getResources().getColor(R.color.light_cyan, null));
} else {
holder.itemView.setBackgroundColor(holder.itemView.getContext().getResources().getColor(R.color.light_cyan));
}
} else {
holder.itemView.setPadding(20, 20, 20, 20);
holder.itemView.setVisibility(View.VISIBLE);
if (Build.VERSION.SDK_INT >= 23) {
holder.itemView.setBackgroundColor(holder.itemView.getContext().getResources().getColor(R.color.light_pink, null));
} else {
holder.itemView.setBackgroundColor(holder.itemView.getContext().getResources().getColor(R.color.light_pink));
}
}
final String rule = structure.name;
holder.cbRule.setText(rule);
holder.cbRule.setTag(structure);
holder.cbRule.setVisibility(View.VISIBLE);
holder.cbRule.setOnCheckedChangeListener(checkChangedListener);
}
答案 0 :(得分:0)
刚想办法处理这种情况。分享它以防其他人将来有类似的查询。
对于尚未显示的视图,我只是在适配器正在使用的数组中标记它们。数组的每个元素都有一个名称和类型。使用类型来存储复选框的状态,每次循环器视图创建视图时,状态都与存储在类型中的值一致。
由于