2012-08-17 62 views
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_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。预先感谢任何信息,您可以提供

回答

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接口,但个人从未取得过成功。

+0

仍然不能用于我的行背景。它仍然呈现棕色。当它被认为是在黑色和灰色之间交替时,行的主色也是全黑的 – BigT 2012-08-17 15:34:44

+0

当你说它变成了棕色时,你的意思是按下时的变化正在工作,但它会变成一些棕色颜色而不是#ABCC2A的绿色?行背景当前是黑色的#000000,还是一些应该是的#1B1B1B? – skyrift 2012-08-17 15:51:30

+0

这些行目前是黑色的,是的,它会去一些褐色,而不是我想要的绿色。 – BigT 2012-08-20 14:27:24

0

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