如何在回收器视图中访问尚未在屏幕上可见的复选框



我是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);
}

刚刚想到一个处理这种情况的方法。分享它,以防将来有人有类似的查询。

对于还不可见的视图,我只是将它们标记在适配器正在使用的数组中。数组的每个元素都有一个名称和类型。使用type存储复选框的状态,每次回收者视图创建视图时,状态按照type中存储的值。

谢谢

相关内容

最新更新