0

我的自定义适配器中有这些代码行:

int colorPos = position % colours.length;
vi.setBackgroundColor(colours[colorPos]);

colours定义如下:

private int[] colours = new int[] { R.drawable.row_colour, R.drawable.row_colour2 };

我使用它,因此当用户单击我的其中一行时,背景颜色会发生变化。我有每一行交替的颜色,所以这就是为什么有两个R.drawable.row_colours。初始颜色应该是灰色的,但所有的行都是黑色的。当我点击每一行时,它会变成这种棕色。这是我的 row_colour 和 row_colour2 代码:

行颜色

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_focused="true" android:state_pressed="false" android:color="#ABCC2A" />
  <item android:state_focused="true" android:state_pressed="true" android:color="#ABCC2A" />
  <item android:state_focused="false" android:state_pressed="true" android:color="#ABCC2A" />
  <item android:color="#424242" />
</selector>

行颜色2

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_focused="true" android:state_pressed="false" android:color="#ABCC2A" />
  <item android:state_focused="true" android:state_pressed="true" android:color="#ABCC2A" />
  <item android:state_focused="false" android:state_pressed="true" android:color="#ABCC2A" />
  <item android:color="#1B1B1B" />
</selector>

我需要更改背景的颜色,但是使用此代码无法正常工作。我需要这些行在它们被点击时和#424242之间交替。提前感谢您提供的任何信息#1B1B1B#ABCC2A

4

2 回答 2

0

如果您从适配器中的方法 getView 以编程方式更改颜色,则必须通过 set 方法或其他方法更新适配器中的状态...然后调用强制 ListView 重绘其状态的函数,因此通过在适配器上调用 getView 来重建列表项。我尝试了 ListView.invalidate() 并且它有效,但 BaseAdapter.notifyDataSetChanged() 也应该有效。

于 2012-08-18T06:57:02.643 回答
0

假设您希望颜色仅在用户按下项目时暂时改变,只需删除 state_focused 元素,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_pressed="true" android:color="#ABCC2A" />
  <item android:color="#424242" />
</selector>

但是,如果您希望颜色保持更改,则需要扩展适配器或列表并存储已选择的项目,或者扩展每个项目的根布局以存储是否已选择。然后,在您的自定义适配器中,在提供视图时,查询此信息并修改背景颜色以适应。总而言之,实现本应简单的事情的一种混乱而复杂的方式。我听说另一种方法是在您的项目的扩展根布局中实现 Checkable 接口,但个人从未在此方面取得成功。

于 2012-08-17T15:09:47.330 回答