ListView中的onItemClick随机更改背景颜色

时间:2012-03-31 18:58:06

标签: android listview background-color

我正在使用多项选择ListView项目。用户可以选择多个项目。所以我想通过更改列表行的文本颜色或背景颜色来突出显示用户选择的项目。我已经通过堆栈溢出链接但没有得到正确的解决方案。当我尝试这样做时,它会随机更改任何未选择的项目背景颜色。救命!!!

public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
    videocursor.moveToPosition(position);
    v.setBackgroundColor(Color.parseColor("#80B7DBE8"));
    SaveSelections();
}

5 个答案:

答案 0 :(得分:4)

随机变化的背景颜色是由于ListView 在其列表中回收视图的原因,以避免不必要的内存消耗。您需要提供自己的自定义适配器,在该适配器中需要覆盖 getView 方法并执行一些检查以仅突出显示那些将某种标志设置为true以用于背景颜色的列表项

答案 1 :(得分:3)

远比上述建议更好的是使用选择器,也称为状态列表drawable。这样,操作系统负责所有的颜色突出显示等业务。

更明确地说,使用以下xml并将其保存在res / drawable下,如li_background.xml(我正在使用图像,但可以随意根据您的情况换出颜色)

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
        <item android:state_focused="true"
          android:drawable="@drawable/list_item_pressed" />
    <item android:state_pressed="true"
          android:drawable="@drawable/list_item_pressed" />
    <item android:state_selected="true"
          android:state_activated="true"
          android:drawable="@drawable/list_item_selected" />
    <item android:state_activated="true"
          android:drawable="@drawable/list_item_selected" />
    <item android:state_selected="true"
          android:drawable="@android:color/black" />
    <item android:drawable="@android:color/transparent" />
</selector>

并将ListView中所有 ListItems的背景设置为R.drawable.li_background。如果你的listView被正确配置为多个选择(android:choiceMode="multipleChoice"listView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);,如果你愿意),那么android将负责其余的事情。这些东西没有很好的记录,我很难找到解决方案,我一直看到类似的问题,但相关的dos是herehere

答案 2 :(得分:2)

您可能应该覆盖适配器中的getView(),并更改其中的行背景颜色。

一个例子:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if(convertView != null) {
        if (mSelectedPositions.contains(position)) {
            convertView.setBackgroundColor(Color.parseColor("#3fa9f5"));
        } else {
            convertView.setBackgroundColor(Color.parseColor("#ffffff"));
        }
    }
    return super.getView(position, convertView, parent);
}

答案 3 :(得分:2)

Wagas是正确的。在适配器的getView中,您将传递一个视图(由Eclipse的自动完成功能调用convertView)。这是因为ListView回收了每行的视图。如果为给定的View设置属性,则在回收该属性时将保留该属性。

出于这个原因,您永远不应该在支持View的适配器的getView方法之外的给定行ListView中设置任何属性。

您可以通过多种方式处理此问题,但基本的想法是,您希望设置一些使用传递给position的{​​{1}}来设置标记的数据。然后检查适配器onItemClick中的标志,以确定如何设置行getView的背景。

例如,如果只能选择一个项目,您可以设置一个成员变量,在适配器本身上说View到传递给mPosition的位置,然后检入{{ 1}}如果position == mSelectedPosition决定如何设置View。如果可以选择多个项目,可能需要在适配器中包含的每个对象上设置成员变量。

答案 4 :(得分:0)

onItemClick()中的

只需使用adapter.notifyDataChange();还将标志设置为true;

在CustomAdapter的getView()中使用布尔标志来知道是否选中了该行。 然后只需检查该标志并按照您的意愿继续操作 即, 如果(标志){ v.setBackgroundColor(Color.parseColor( “#80B7DBE8”)); }其他{ v.setBackgroundColor(Color.parseColor( “#FF0000”)); }

相关问题