如何在列表视图中突出显示多个项目?

10

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

所以我尝试了SngList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);但没有帮助

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

我正在使用ListView而不是AbsListView

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

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

我也不想使用复选框,如果这里找不到解决方案,我想可能会为每个项目使用布尔值,并将其传递给getviews,但那似乎不够优雅和简洁。 我相信有一种适当的内置方法可以做到这一点,而不使用适配器的getview()

我尝试过:

android:drawSelectorOnTop="false"
android:listSelector="@android:color/darker_gray"

XML中只有一个项目被突出显示,但只要我点击另一个项目,它就会突出显示它而不是之前的那个...

那么有没有正确的方法来解决这个问题呢?

这是我的应用程序的外观:

enter image description here


2
我无法提供帮助,但我想说,这是一个很棒的应用程序! - Ethan Bierlein
哈哈哈,谢谢啊... 如果你想了解更多信息,这里是链接 www.facebook.com/playmeeofficial - Ankit Srivastava
@TheNotGoodAtCodeGuy请看一下 https://play.google.com/store/apps/details?id=bitsie.playmee.musicplayer.free - Ankit Srivastava
3个回答

3
SngList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

这应该足够了,但你需要使用getView来区分选中和未选中状态。

你可以使用isItemChecked()方法来确定项目是否被选中,因此你不必为每个项目引入一个布尔变量。

编辑:

类似这样:

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

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

请详细说明:我已经在使用多选模式,我应该创建所有突出显示项目的列表,然后在适配器中生成视图时应该创建一个检查吗?或者您建议什么? - Ankit Srivastava
这就是choice_mode_multiple的精髓。在该模式下,您无需维护列表,因为ListView会为您完成。 - kupsef
好的,明白了。我可以为高亮部分设置不同的背景颜色吗?还是有其他直接的方法吗? 我正在使用视图重用和视图持有者模式,如何处理它? 如果我取消选中,它会自动更新吗? - Ankit Srivastava
正如我所怀疑的那样,你的解决方案可以工作,但不适用于ViewHolder模式...错误的项目也被突出显示了。 - Ankit Srivastava
就像这里https://dev59.com/u1HTa4cB1Zd3GeqPQ1-A - Ankit Srivastava
显示剩余2条评论

3

您可以使用与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">

....

设置 onItemClickListener 以在长按时更改选择模式

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");
        }
    }
});

是的,我已经实现了第一部分,但在onitemclick中,我希望它被突出显示,这就是问题所在...如何突出显示它?如果您还没有,请再次阅读。 - Ankit Srivastava
当在列表项上设置android:foreground="?android:attr/activatedBackgroundIndicator"并调用listView.setItemChecked(arg2, true);以CHOICE_MODE_MULTIPLE模式时,AbsListView会自动突出显示它。 - Yaroslav Mytkalyk
框架布局是必要的吗? - Ankit Srivastava
@AnkitSrivastava LinearLayout没有android:foreground属性,只有FrameLayout有。对于LinearLayout,请使用android:background。我在这里创建了一个测试项目http://goo.gl/H7y0Ft。 - Yaroslav Mytkalyk
我正在使用一个自定义适配器...它扩展了基本适配器。 - Ankit Srivastava
显示剩余16条评论

1

使用SngList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

然后在适配器中手动执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接