在ListView中突出显示多个选定/已选中/已激活

woo*_*666 8 java android

哇,文档在列表项选择方面很可怕.我只需要能够选择并突出显示列表中的多个项目.我已经浏览了网页并看到了引用android:choiceMode="multipleChoice",我猜这可以让你选择多个项目.但是我在哪里可以获取我的活动中的所选项目?为什么当我尝试使用选择多个项目时setSelection(position),之前突出显示的项目会消失?

谷歌也在View.setActivated(boolean)那里描述

请注意,激活与选择不同.选择是一个瞬态属性,表示用户当前正在与之交互的视图(层次结构).激活是一种较长期的状态,用户可以将视图移入和移出.例如,在启用了单个或多个选择的列表视图中,将激活当前选择集中的视图.(嗯,是的,我们对这里的术语深感抱歉.)

所以我应该使用激活而不是选择?这个SO答案谈到"激活"只是"已检查"的后HoneyComb版本.但是,如果您应该使用"激活"进行多项选择,android:choiceMode="multipleChoice"那么首先是什么意思呢?

woo*_*666 13

所以显然我被引出了错误的轨道,因为我应该寻找突出显示"已检查"项目而不是"选定"项目.因此,许多答案告诉我使用selector我的ListView布局使用android:listSelector="@drawable/myselector,但我真正需要的是使用selector我的行布局.解决方案实际上相当简单,我将在下面发布:

绘制/ rowbackgroundselector.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_activated="true"
    android:drawable="@android:color/holo_green_light"/>
</selector>
Run Code Online (Sandbox Code Playgroud)
  • 请注意您如何使用"state_activated"来检测项目是否"已选中"...

绘制/ mylistrow.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:background="@drawable/rowbackgroundselector"
    android:padding="10sp"
/>
Run Code Online (Sandbox Code Playgroud)
  • 使用行背景的选择器

MainActivity.onListItemClick()

public void onListItemClick(ListView l, View v, int position, long id) {
    getListView().setItemChecked(pos, true);
}
Run Code Online (Sandbox Code Playgroud)

最后,确保您的适配器使用自定义行布局

mAdapter = new ArrayAdapter<FileTag>(this.getActivity(),
    R.layout.mylistrow, mList);
Run Code Online (Sandbox Code Playgroud)