Android列表视图选择的背景在2.3中不起作用

时间:2013-04-03 22:02:58

标签: android listview background

我正在尝试让我的应用程序在2.3中正常工作(它在4.0+中工作正常)而我遇到的一个问题是在我的listview上我无法获得所选项目的背景更改。我不确定我需要改变什么 - 有人知道吗?

这是listview本身:

<ListView
    android:id="@+id/score_list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_above="@+id/keyboard"
    android:layout_below="@+id/sort_header"
    android:choiceMode="singleChoice"
    android:divider="#CCCCCC"
    android:dividerHeight="1dp"
    android:listSelector="@drawable/selector" />

这是在4.0+中工作的选择器(在2.3中没有颜色变化):

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:drawable="@color/highlight"/>
    <item android:state_pressed="true" android:drawable="@color/highlight"/>
    <item android:state_activated="true" android:drawable="@color/highlight"/>
    <item android:state_selected="true" android:drawable="@color/highlight"/>
</selector>

我实际上并不需要所有4个,但我想尝试一切。

4 个答案:

答案 0 :(得分:7)

我有完全相同的问题。我还没有找到如何在XML中执行此操作的方法,但我在代码中找到了一种解决方法。以下代码在支持API级别7 +

的应用程序中进行了测试

首先,您需要稍微更改ListView的适配器:

public class ListViewAdapter extends BaseAdapter {
  private int selectedItemPosition = -1;

  // your code

  public void selectItem(int i) {
    selectedItemPosition = i;
  }

  @Override
  public View getView(int i, View view, ViewGroup viewGroup) {

    // your code

    if (i == selectedItemPosition) {
      // set the desired background color
      textView.setBackgroundColor(context.getResources().getColor(R.color.highlight));
    }
    else {
      // set the default (not selected) background color to a transparent color (or any other)
      textView.setBackgroundColor(Color.TRANSPARENT);
    }
    return view;
  }
}

接下来,您必须通知适配器OnItemClickListener的{​​{1}}中的选择已更改:

onItemClickMethod

那应该是它。现在,无论何时您不想更改所选项目,您都可以使用@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // select the item ((ListViewAdapter) listview.getAdapter()).selectItem(position); // force redraw of the listview (invalidating just "view" is not enough) ((ListView) parent).invalidateViews(); // your code } 中使用的相同代码,即。 onItemClick()后跟selectItem()。 invalidateViews(),而不是调用invalidateViews()

此外,您还应该在列表视图中添加适当的listSelector,以避免在单击项目时短暂闪烁默认选择器。但是,当整个视图的背景发生变化时,API 7和8上的列表选择器存在错误。您可以找到解决方法here

答案 1 :(得分:1)

尝试在listview android:cacheColorHint="@null中设置媒体资源。列表视图背景不会被触摸高亮。

答案 2 :(得分:0)

android:state_activated在API级别11中引入。

请参阅此链接Drawable Resources

<强>更新

我在我的应用中使用此功能(API级别8)

    <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Selector style for listrow -->
<item 
 android:state_selected="false"
    android:state_pressed="false" 
    android:state_focused="false"
    android:drawable="@color/normal"/> 

<item android:state_pressed="true"
        android:drawable="@color/highlight"/>

<item android:state_selected="true"
     android:state_pressed="false"
     android:drawable="@color/highlight"/>

<item android:state_focused="true"
     android:state_pressed="false"
     android:drawable="@color/highlight"/>
</selector>

答案 3 :(得分:0)

正如在AwdKab响应中所写,android:state_activated是在API级别11中引入的。解决方案是为列表项布局的顶部Checkable实现View接口,请参阅我的{ {3}}