【问题标题】:Every seventh box checked with CheckBoxes in ListView在 ListView 中每隔七个用 CheckBoxes 选中一个框
【发布时间】:2026-02-09 15:30:01
【问题描述】:

我有一个包含 649 个条目的 ListView。列表中的每个 View 都有两个 LinearLayout、一个 ImageView、几个 TextView 和一个 CheckBox。我目前有代码可以遍历所有 CheckBox 并对它们进行计数,还有更多代码可以确定哪些复选框被选中,以便我可以使用它们。但是,每当我选中其中一个 CheckBox 时,它上方和下方的每七个 CheckBox 也会神奇地被选中。计算选中框的方法返回我实际选中的数字,但获取所有选中框的索引的方法只返回第一个选中的 x,不管我是选中它们还是距离它们 7 个。例如,如果我检查数字 21,该方法返回索引 3。我已经包含了一些相关的代码段: 列表中每个View的布局代码:

<?xml version="1.0" encoding="utf-8"?>

<TextView
    android:id="@+id/id"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:textSize="20sp"/>

<LinearLayout
    android:layout_width="180dp"
    android:layout_height="50dp"
    android:orientation="vertical">

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/name"/>

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:textColor="#777777"
        android:id="@+id/type"/>

</LinearLayout>
<CheckBox
    android:layout_gravity="right|center_horizontal"
    android:id="@+id/check"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:focusableInTouchMode="false"/>

支票计数方法:

    public int[] whichAreChecked()  //TODO: this should work.
{
    int listItemCount = ChooserList.getChildCount();
    ArrayList<Integer> ints=new ArrayList<Integer>();
    for(int i=0; i<listItemCount; i++)
    {
        CheckBox cbox = (CheckBox) ((View)ChooserList.getChildAt(i)).findViewById(R.id.check);
        if(cbox.isChecked())
            ints.add(i);
    }
    Log.e("durr", ""+ints.size());
    int[] result=new int[ints.size()];
    for(int i=0; i<result.length; i++)
        result[i]=ints.get(i);
    return result;
}

支票计数方法:

    public int countChecks()
{
    int checked=0;
    int listItemCount = ChooserList.getChildCount();
    for(int i=0; i<listItemCount; i++)
    {
        CheckBox cbox = (CheckBox) ((View)ChooserList.getChildAt(i)).findViewById(R.id.check);
        if(cbox.isChecked())
            checked++;
    }
    Log.e("countChecks()", ""+checked);
    return checked;
}

如果我可以添加任何额外信息,请询问!

【问题讨论】:

    标签: android listview checkbox


    【解决方案1】:

    嗯,我认为您误解了 getChildCount()getChildAt() 方法的作用。这些实际上只会获得 渲染 视图。除非我在这里误读了某些内容,否则如果您有 650 行,您将无法通过正在呈现的视图完成您想要的操作。相反,您应该实现onItemClickListener(或者,单击复选框时触发的东西)并在选中复选框后将该状态保存到您的模型中。

    【讨论】:

    • 感谢您的回复!我在自定义适配器中的每个 CheckBox 中添加了一个onCheckChangedListener,并将其索引添加到 Activity 中的静态 ArrayList 中,并相应地更新了从中读取的方法。但是,每当我只选中一个时,每七个框都会被选中,这就是导致整个问题的原因。
    • 啊,修好了!我的适配器并不总是在应该构建新视图的时候。 '这一切都解决了!谢谢!
    • 你能详细说明它是如何固定的吗?
    • @ShawnWalton - 你不再回收视图了吗?
    【解决方案2】:

    我也遇到过类似的问题,所以经过大量阅读后,我解决了这个问题:

    @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.listview, null);
                holder = new ViewHolder();
                holder.nameView = (TextView)convertView.findViewById(R.id.textView1);
                holder.numberView = (TextView)convertView.findViewById(R.id.textView2);
                holder.cb = (CheckBox)convertView.findViewById(R.id.checkBox1);
                convertView.setTag(holder);                
            } else {
                holder = (ViewHolder)convertView.getTag();
            }
            holder.nameView.setText(mData.get(position).toString());
            holder.numberView.setText(mNumber.get(position).toString());
            holder.cb.setChecked(false);
            holder.cb.setTag(position);
    
    
    
            if(selected.indexOf(mNumber.get(position).toString()) >= 0)
            {
    
            holder.cb.setChecked(true);
            }
    
            return convertView;
        }
    
    }
    

    这是我在 getView() 上所做的,我取消选中所有复选框并再次手动检查那些我需要根据它对应的 textview 检查的复选框。因此,如果用户在选中第一个复选框后向下滚动,则视图中的所有复选框都将被取消选中,如果他再次向上滚动,那么所有复选框也将被取消选中,但他之前单击的复选框将再次被重新选中。

    【讨论】: