【问题标题】:How to highlight ListView item on touch?如何在触摸时突出显示 ListView 项目?
【发布时间】:2011-03-09 15:43:29
【问题描述】:

我有一个简单的ListView,我希望每个项目都能在用户触摸时突出显示。我认为这应该默认发生,但事实并非如此。能给个建议吗?

列表视图 xml:

<ListView
    android:id="@+id/list_view"     
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp"
    android:divider="#206600"
    android:dividerHeight="2dp"
    android:smoothScrollbar="true"
    android:background="#ffffff"
    >
</ListView>

以及我的适配器代码:

private class MyAdapter extends ArrayAdapter<Task> {
        private LayoutInflater mInflater;

        public MyAdapter(Context context, int resource, List<Task> list) {
            super(context, resource, list);
            mInflater = LayoutInflater.from(context);
        }

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

            if (v == null) {
                v = mInflater.inflate(R.layout.list_item, null);
            }

            Task task = taskList.get(position);

            /* Setup views from your layout using data in Object here */

            return v;
        }

【问题讨论】:

    标签: android android-listview


    【解决方案1】:

    您可能想发布实际的行布局代码,但我怀疑问题在于您在列表行上设置了背景颜色。默认情况下,选择器绘制在列表项的后面(看起来更好,因为突出显示颜色在文本后面)。要么不要在列表项上设置背景颜色,要么将其设置为在顶部绘制选择器,而不是使用 ListView 的 drawSelectorOnTop XML 属性。

    编辑:如果你真的必须有一个默认状态的不透明背景并且不想使用drawSelectorOnTop,你也可以试试这个:在你的列表行上设置背景,但是使用 StateListDrawable 来使用@987654325 @ 表示除默认状态之外的所有状态(您可以为此在您的可绘制文件夹中定义一个 xml 文件;请参阅 StateList documentation)。

    您还可以在外部背景行布局中嵌套一个布局,其背景设置为@android:drawable/list_selector_background;这样背景将绘制在您的背景之上,但在内容之下。

    【讨论】:

    • 另外,我误解了你的基本问题吗?您是在谈论按下状态,还是希望在触摸和取消后保留选定状态(在这种情况下,RivieraKid 的回答更相关)?
    • 删除背景没有做任何改变,所以我现在可以看到选择,谢谢。
    • “drawSelectorOnTop”属性对我有用。请注意,较暗的应用程序主题将使用较亮的选择器,如果您的行背景为白色,您可能看不到它。 (如果您使用的是较轻的应用主题,则反之亦然。)
    【解决方案2】:

    ListViews 在触摸模式下不会保留焦点(或选择)的视觉指示。只有当您使用硬件键盘或控件来导航您的 UI 时,您才会看到这一点。

    有关详细信息,请参阅 Google Touch Mode Android 博客文章。

    因此,如果您只使用触摸模式,您将永远不会在 ListViews 上看到焦点或选择。

    【讨论】:

      【解决方案3】:

      我认为这与 ListAdapter 中项目的“启用”属性有关。

      如果您的适配器包含代码:

      @Override
      public boolean areAllItemsEnabled() {
          return true;
      }
      

      然后每个项目都应该是可点击的(因此应该在被触摸时突出显示)。

      您能否发布您在此列表中使用的适配器类型的详细信息(可能还有代码)?

      【讨论】:

      • 嗯,就是这样,姊妹方法 isEnabled(int position)。如果您在 getView() 方法中添加对它的调用并使用调试器单步执行它,您可以找出未启用的项目是否是问题。
      【解决方案4】:

      我为此苦苦挣扎了几天。最后,我必须创建一个支持Checkable 接口的小部件,并在我的适配器的getiew() 函数中返回该小部件/视图。并且列表视图需要处于ListView.CHOICE_MODE_SINGLE(或可能由android:choiceMode 指定的任何其他模式)才能跟踪用户界面上所做的选择。

      因此,从本质上讲,需要具备以下所有条件才能使列表视图项保持突出显示:

      1. ListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
      2. ListAdapter.getView() 返回一个实现了Checkable 接口的视图
      3. ListView.OnItemClickListener 应该调用 setItemChecked(position, true) 来标记要检查的项目(从而在列表视图中突出显示它)

      希望这可以帮助那些也在为此苦苦挣扎的人。

      【讨论】:

        猜你喜欢
        • 2015-10-25
        • 1970-01-01
        • 2013-02-04
        • 1970-01-01
        • 2014-10-15
        • 2014-02-03
        • 2012-01-05
        • 2011-05-01
        • 2014-01-14
        相关资源
        最近更新 更多