如何在触摸时突出显示ListView项?

时间:2011-03-09 15:43:30

标签: android android-listview

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

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

4 个答案:

答案 0 :(得分:23)

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

编辑:如果您确实必须拥有默认状态的不透明背景并且不想使用drawSelectorOnTop,您还可以尝试这样做:在列表行上设置背景,但使用StateListDrawable来使用@android:drawable/list_selector_background用于除默认状态之外的所有状态(您可以在drawables文件夹中为此定义xml文件;请参阅StateList documentation)。

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

答案 1 :(得分:2)

在触摸模式下,

ListView不保留焦点(或选择)的视觉指示。只有在使用硬件键盘或控件导航UI时,才会看到此信息。

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

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

答案 2 :(得分:0)

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

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

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

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

您是否可以发布此列表中使用的适配器的详细信息(以及可能的代码)?

答案 3 :(得分:0)

我挣扎了几天。最后,我必须创建一个支持Checkable接口的小部件,并在我的适配器的getiew()函数中返回该小部件/视图。列表视图需要位于ListView.CHOICE_MODE_SINGLE(或者可能是android:choiceMode指定的任何其他模式),以便跟踪在UI上做出的选择。

所以从本质上讲,以下所有内容都需要使列表视图项保持突出显示:

  1. ListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
  2. ListAdapter.getView()返回实现Checkable interface
  3. 的视图
  4. ListView.OnItemClickListener应致电setItemChecked(position, true)以标记要检查的项目(并在列表视图中突出显示)
  5. 希望这可以帮助那些也在努力解决这个问题的人。