Android - 自定义ListView上的setChoiceMode =无效

时间:2012-12-20 08:57:40

标签: android android-layout android-listview

我正在使用我用于 ListView 的自定义适配器。创建ArrayList后

WifiListAdapter<WifiListItem> adapter = new WifiListAdapter<WifiListItem>(
            this, R.layout.listview_item_text, listItems);

我的应用中有以下代码:

    ListView listView = (ListView) findViewById(android.R.id.list);
    listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    listView.setAdapter(adapter);

然而,当我尝试点击复选框时,没有任何反应。所以我必须手动切换复选框状态。

    protected void onListItemClick(ListView l, View v, int position, long id) {
    CheckedTextView checkBox = (CheckedTextView) v
            .findViewById(R.id.text1);
    if (checkBox != null) {
        checkBox.toggle();

然后它有效。 (在此之前我必须删除setChoiceMode方法调用)

那么可能是什么问题?为什么没有效果?

我的R.layout.listview_item_text.xml

    <TextView
    android:id="@+id/topText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="22sp"
    android:paddingTop="7dp"
    android:textColor="?android:attr/textColorPrimary"/>

<TextView
    android:id="@+id/botText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="17sp"
    android:paddingTop="2dp"
    android:paddingBottom="7dp"
    android:textColor="?android:attr/textColorTertiary"
 />

在我的适配器中,我使用以下代码扩充复选框布局:

                convertView = mInflater.inflate(
                        R.layout.listview_item_checkbox, null);

            CheckedTextView checkbox = ((CheckedTextView) convertView
                    .findViewById(R.id.text1))

listview_item_checkbox.xml

    <CheckedTextView
    android:id="@+id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:textSize="22sp"
    android:paddingTop="7dp"
    android:paddingBottom="7dp"
    android:checkMark="?android:attr/listChoiceIndicatorMultiple"
     />

3 个答案:

答案 0 :(得分:3)

而不是你的代码:

if (checkBox != null)
        checkBox.toggle();

尝试这样的事情:

if (checkBox != null) checkBox.setChecked(l.getCheckedItemPositions().get(position));

如果可以 - 改进您的代码(创建CheckableFrameLayout作为列表项的父布局)。 ListView保留BooleanSparseArray个已检查的位置(您可以使用方法getCheckedItemPositions()获取)。在代码(grepcode)中,仅当View正在实施Checkable时,它才会自行设置View。如果创建CheckableFrameLayout并作为主要父级,则不必在适配器中处理这些情况。

答案 1 :(得分:2)

我相信您必须使用实现Checkable的小部件。试试android.R.layout.simple_list_item_multiple_choice。如果你需要两行,那就实现类似的东西。

答案 2 :(得分:0)

问题是源代码中存在一些问题(当我写这个答案时,最新版本的事件,4.3r2.1)。这是问题所在:

1899        if (mChoiceMode != CHOICE_MODE_NONE && mCheckStates != null) {
1900            if (child instanceof Checkable) {
1901                ((Checkable) child).setChecked(mCheckStates.get(position));
1902            } else if (getContext().getApplicationInfo().targetSdkVersion
1903                    >= android.os.Build.VERSION_CODES.HONEYCOMB) {
1904                child.setActivated(mCheckStates.get(position));
1905            }
1906        }

源代码: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r2.1/android/widget/ListView.java?av=f

对于您的问题,如果您的minSDK为11,最简单的答案是自定义如下所示的复选框:

<?xml version="1.0" encoding="utf-8"?>
<selector
 xmlns:android="http://schemas.android.com/apk/res/android" >
 <item android:state_activated="true" android:drawable="@drawable/checkbox_selected"/>
 <item android:state_activated="false" android:drawable="@drawable/checkbox_deselected" />
 <item android:state_checked="false" android:drawable="@drawable/checkbox_deselected" />
 <item android:state_checked="true" android:drawable="@drawable/checkbox_selected" />
</selector>

将其作为xml文件保存到drawable文件夹,并将其作为布局引用。

中级解决方案设置在onItemClickListener上,并根据选择模式执行不同的行为。

以下是有效的源代码: https://github.com/jiahaoliuliu/CustomizedListRow

艰难但正确的解决方案是来自MarvinLab的解决方案,你可以在这里找到它: http://www.marvinlabs.com/2010/10/29/custom-listview-ability-check-items/

相关问题: What is the difference between the states selected, checked and activated in Android?