【问题标题】:How to highlight multiple items in a list view?如何在列表视图中突出显示多个项目?
【发布时间】:2016-01-19 01:15:04
【问题描述】:

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

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

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

我使用的是 ListView 而不是 AbsListView

我不想使用 CAB,因为它不适合我的应用设计

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

我也不想使用复选框,我想我会为每个项目使用一个布尔值并将其传递给getviews,如果我在这里没有得到解决方案,但这似乎不太优雅和整洁.我相信有一种适当的内置方法可以在不使用适配器的getview() 的情况下进行操作

我试过了:

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

在 xml 中,但它只突出显示其中一个项目,一旦我单击另一个项目,它就会突出显示它...

那么有没有合适的方法呢?

这是我的应用的外观:

【问题讨论】:

  • 我忍不住,但我会说,好看的应用程序!
  • hahahathanx man...如果您想了解更多信息,请点击链接 www.facebook.com/playmeeofficial
  • @TheNotGoodAtCodeGuy 看看play.google.com/store/apps/…

标签: android listview


【解决方案1】:

你可以做与 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 中我希望它被突出显示,这就是问题..如何突出显示它?如果你还没有,请再读一遍
  • 在列表项上设置 android:foreground="?android:attr/activatedBackgroundIndicator" 并调用 listView.setItemChecked(arg2, true);在 CHOICE_MODE_MULTIPLE 中。
  • framelayout 是必不可少的吗?
  • 我使用的是列表视图而不是绝对列表视图
  • 我将所有内容都更改为 abslistview 并在 line view = (ViewGroup) inflater.inflate(R.layout.l_songs, null);
【解决方案2】:
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{
        //...
    }

【讨论】:

  • 请详细说明..我已经在使用choice_mode multiple 我应该创建一个所有突出显示项目的列表,对吗?那么在适配器中生成视图时,我应该创建一个检查?或者你有什么建议请详细说明
  • 这就是choice_mode_multiple的本质。您不必维护列表,因为 ListView 在该模式下会为您完成。
  • 好的理解..我会设置不同的背景(突出显示)还是有任何直接的方法?我正在使用视图可重用性和视图持有者模式,如何处理它?如果我取消选中它会自动更新吗
  • 好吧,我不是很了解你,但是如何区分选中和未选中状态取决于你。据我所知,没有内置的设计,所以你必须像我上面介绍的 if-else 部分那样做。此状态更改在内部处理,因此即使使用 ViewHolder 模式也应该没问题。重要的是正确处理 isItemChanged() 逻辑。
  • 正如我所怀疑的,您的解决方案有效,但不适用于查看器模式...错误的项目也被突出显示
【解决方案3】:

使用 SngList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 2019-09-03
    • 2012-11-21
    • 2012-04-19
    • 2012-05-21
    相关资源
    最近更新 更多