Android 如何在列表视图中高亮显示多个项目?

Android 如何在列表视图中高亮显示多个项目?,android,listview,Android,Listview,大家好,我想在列表视图中突出显示多个项目 所以我尝试了SngList.setChoiceMode(ListView.CHOICE\u MODE\u MULTIPLE)但它没有帮助 我正在使用自定义适配器并扩展BaseAdapter 我使用的是ListView,而不是AbsListView 我不想使用CAB,因为它与我的应用程序的设计不匹配 我也不想使用适配器的getView方法 我也不想使用复选框,我想我会为每个项目使用一个布尔值,并将其传递给getviews,如果我在这里没有得到解决方案,但这

大家好,我想在列表视图中突出显示多个项目

所以我尝试了
SngList.setChoiceMode(ListView.CHOICE\u MODE\u MULTIPLE)但它没有帮助

我正在使用自定义适配器并扩展
BaseAdapter

我使用的是ListView,而不是AbsListView

我不想使用CAB,因为它与我的应用程序的设计不匹配

我也不想使用适配器的
getView
方法

我也不想使用复选框,我想我会为每个项目使用一个布尔值,并将其传递给
getviews
,如果我在这里没有得到解决方案,但这看起来不太优雅和整洁。我相信有一种正确的内置方法可以做到这一点,而不必使用适配器的
getview()

我试过:

android:drawSelectorOnTop="false"
android:listSelector="@android:color/darker_gray"
在xml中,但它只高亮显示其中一个项目,当我单击另一个项目时,它就会高亮显示它

那么有没有合适的方法呢

以下是我的应用程序的外观:

SngList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

这应该足够了,但您必须使用getView来区分选中和未选中的状态

您可以使用方法来确定项目是否被选中,这样就不必为每个项目引入布尔变量

编辑:

大概是这样的:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ListView list = (ListView) parent;

    if(list.isItemChecked(position)){
        //...
    }
    else{
        //...
    }

您可以使用与CAB相同的逻辑,但避免使用CAB

您的列表项应该在根目录处具有FrameLayout

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:foreground="?android:attr/activatedBackgroundIndicator">

....

....
设置McClickListener以更改长按时的选择模式

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

    @Override
    public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        if (mInMultiChoiceMode) {
            // if already in multi choice - do nothing
            return false;
        }

        mInMultiChoiceMode = true;
        // set checked selected item and enter multi selection mode
        final AbsListView list = (AbsListView) arg0;
        list.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
        list.setItemChecked(arg2, true);

        return true;
    }
});

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        if (mInMultiChoiceMode) {
            //exit multi choice mode if number of selected items is 0
            if (((AbsListView) arg0).getCheckedItemCount() == 0) {
                ((AbsListView) arg0).setChoiceMode(AbsListView.CHOICE_MODE_NONE);
                mInMultiChoiceMode = false;
            }
        } else {
            // do whatever you should as in normal non-multi item click
            System.out.println("CLICK");
        }
    }
});
listView.setOnItemLongClickListener(新的AdapterView.OnItemLongClickListener(){
@凌驾
公共布尔值长单击(AdapterView arg0、视图arg1、整型arg2、长型arg3){
if(最小多选模式){
//如果已经在多项选择中-什么也不做
返回false;
}
mInMultiChoiceMode=true;
//设置选中的项目并进入多选模式
最终AbsListView列表=(AbsListView)arg0;
list.setChoiceMode(AbsListView.CHOICE\u MODE\u MULTIPLE);
list.setItemChecked(arg2,true);
返回true;
}
});
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
公共视图单击(AdapterView arg0、视图arg1、整型arg2、长型arg3){
if(最小多选模式){
//如果所选项目数为0,则退出多选模式
如果(((AbsListView)arg0.getCheckedItemCount()==0){
((AbsListView)arg0.setChoiceMode(AbsListView.CHOICE\u MODE\u NONE);
mInMultiChoiceMode=false;
}
}否则{
//做任何你应该做的事情,就像在普通的非多项目点击中一样
System.out.println(“单击”);
}
}
});
使用 SngList.setChoiceMode(ListView.CHOICE\u MODE\u MULTIPLE)


然后在适配器中手动执行此操作

我没办法,但我会说,好看的应用程序!哈哈哈,thanx人。。。如果您想了解更多信息,请访问www.facebook.com/playmeeofficial@TheNotGoodAtCodeGuy看一看请详细说明..我已经在使用choice_mode multiple我应该创建一个所有突出显示项目的列表,对吗?然后在适配器中生成视图时,我应该创建一个检查?或者你的建议是什么请详细说明这是选择的本质。您不必维护列表,因为ListView在该模式下为您进行维护。好的,理解..我会设置不同的背景(突出显示的)还是有直接的方法?我正在使用视图持有者模式的视图重用性,如何处理它?如果我取消选中它,它会自动更新吗?嗯,我真的不理解你,但如何区分选中和未选中状态取决于你。据我所知,没有内置的设计,所以你必须像我在上面介绍的if-else部分那样做。此状态更改是在内部处理的,因此即使使用ViewHolder模式也应该可以。重要的是正确处理isItemChanged()逻辑。正如我所怀疑的,您的解决方案有效,但不适用于viewholder模式…错误的项目被高亮显示。是的,我已经实现了第一部分,但在onitemclick中,我希望它高亮显示,这就是问题。如何高亮显示它?如果设置时未被AblistView自动高亮显示,请重新阅读android:前台=“?android:attr/activatedBackgroundIndicator”,并调用listView.setItemChecked(arg2,true);在选项_MODE_MULTIPLE.framelayout必不可少吗?我使用的是listview而不是abslistview。我将所有内容都更改为abslistview,它在line view=(ViewGroup)充气器处崩溃。充气(R.layout.l_,null);