单击更改文本和行颜色

时间:2012-08-17 13:38:56

标签: android android-layout android-listview

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

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_colour s。初始颜色应该是灰色的,但所有行都是黑色的。当我点击每一行时,它会变成这种棕色。这是我的row_colour和row_colour2代码:

row_colour

<?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>

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="#1B1B1B" />
</selector>

我需要更改背景的颜色,但是这段代码无法正常工作。我需要在#424242#1B1B1B之间切换行,点击它们后转到#ABCC2A。提前感谢您提供的任何信息

2 个答案:

答案 0 :(得分: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接口,但个人从未取得过成功。

答案 1 :(得分:0)

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