5

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

这是列表视图本身:

<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 回答 4

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的 's中的选择已更改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()适配器而不是调用。notifyDataSetChanged()

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

于 2013-09-16T09:24:17.767 回答
1

尝试在您的 listview 中设置属性android:cacheColorHint="@null。列表视图背景不会通过触摸突出显示。

于 2014-02-12T08:55:31.943 回答
0

正如 AwdKab 响应中所写的那样,在 API 级别 11 中引入了。解决方案是为您的列表项布局顶部android:state_activated实现Checkable接口,请参阅我的帖子hereView

于 2014-11-17T10:19:41.977 回答
0

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

请参阅此链接可绘制资源

更新

我在我的应用程序中使用它(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>
于 2013-04-03T22:21:10.253 回答