带Checkbox的Android Custom ListView

时间:2017-11-05 06:53:07

标签: java android listview checkbox

向我的同事们问候, 我正在开发一个项目,其中我有一个listview包含2个textviews和每个项目1个复选框, 我的listview正在工作,因为我想要它,除了当我在列表视图上以编程方式使用setSelection(some_index)时,检查以前的OnItemClickListener调用的所有chechbox都取消选中, 我想弄清楚为什么这是,但到目前为止没有运气, 我确实尝试检查并更改每次滚动后的所有复选框

for (int i = 0; i < listView.getCount(); i++) {
            View mChild = listView.getChildAt(i);
            View mChild1 = listView.getAdapter().getView(i, null, null);
            TextView name = (TextView) mChild.findViewById(R.id.contact_name);
            TextView phone = (TextView) mChild.findViewById(R.id.contact_number);
            CheckBox box = (CheckBox) mChild.findViewById(R.id.contact_check);
            if(contact.getName().equals(name.getText().toString()) && contact.getPhone().equals(phone.getText().toString()))
                box.setChecked(true);
        }

这两种方法(mchild和mchild1)都不起作用,而且它需要花费很多处理时间,因为我的列表视图可能会很长,(给予或接受500项) 关于这个问题的任何帮助,我已经坚持了几天,但是没有任何可靠的解决方案, 我不明白的一点是,为什么我的listview数据集正在改变滚动,任何帮助,有没有更简单,更快的方法来做到这一点,然后通过listview的孩子进行itetrating? 如果没有那么为什么我的迭代逻辑不起作用  这是我的listview项目

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:descendantFocusability="blocksDescendants"
    android:orientation="horizontal">

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="@dimen/list_view_margin_vertical"
        android:layout_marginTop="@dimen/list_view_margin_vertical"
        android:layout_weight="1"
        android:orientation="vertical">

        <TextView
            android:id="@+id/contact_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/colorBlack"
            android:textAppearance="@style/Base.TextAppearance.AppCompat.Large" />

        <TextView
            android:id="@+id/contact_number"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/colorGrey"
            android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium" />
    </LinearLayout>

    <CheckBox
        android:id="@+id/contact_check"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:clickable="false"
        android:layout_gravity="center" />
</LinearLayout>

这是我的列表视图本身

<ListView
        android:id="@+id/contactsListView"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:divider="@color/colorAccent"
        android:dividerHeight="1dp"
        android:footerDividersEnabled="false" />

1 个答案:

答案 0 :(得分:0)

问候我的fello程序员, 我发现列表视图或其工作没有任何问题,我没有注意到listview循环查看子视图,在每个循环默认状态的视图加载后,hense, 修复它所需要的只是, 当getView(适配器类)正在调用时,我们在视图上使用setText来加载和查看可能来自数据库的数据,需要在listview对象的结构中进行布尔检查, 并将该布尔值保存为默认值, 现在每次onitem点击后,当我们更改复选框状态时,我们也必须更改布尔检查值,现在下次调用getview(由于回收或其他原因调用天气)我们将从结构中获取布尔值并保存就像它在复选框中一样 问题解决了, 我了解到,在处理listview中的复选框或单选按钮时,我们必须对它进行布尔检查。我们在适配器类的getView中设置