2012-03-31 80 views
2

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

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

你使用ArrayAdapter如果是这样v​​.setBackgroundColor()不会工作 – Ishu 2012-03-31 19:02:13

回答

3

远远超过以上建议最好是使用一个选择,也被称为一个国家列表绘制。这样一来,操作系统负责所有颜色高亮的业务的,等

更明确,以下面的XML和下水库/可绘制保存为类似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> 

和设置的所有 listItems中的背景在ListView到R.drawable.li_background。如果你的listView被正确配置为多选(android:choiceMode="multipleChoice"listView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);,如果你愿意的话),那么android会照顾其余的。这个东西没有很好的记录,我很难找到解决方案,我总是看到类似的问题,但相关的dos是here和​​

4

即随机地改变背景颜色是由于ListView的回收在其列表视图以避免不必要的存储器消耗的原因。你需要提供你需要重写getView方法,进行一些检查,仅强调谁具有某种标志设置为true背景颜色的列表项自定义的适配器

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); 
} 
0
在onItemClick(

)只使用adapter.notifyDataChange();也设置标志为真;

在您的CustomAdapter的getView()中使用布尔标志来知道该行是否被选中。 然后只需检查该标志并按要求进行 即 if(flag){v.setBackgroundColor(Color.parseColor(“#80B7DBE8”));其他{ v.setBackgroundColor(Color.parseColor(“#FF0000”)); }

2

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

出于这个原因,你永远不应该设置任何事物的特性在给定行的View适配器支持的ListViewgetView方法之外。

有几种方法可以处理这个问题,但基本思路是您要设置一些数据,使用position传入onItemClick来设置标志。然后检查该标志在适配器的getView来决定如何设置该行的View背景。

例如,如果只有一个项目可以选择,你可能只设置一个成员变量,说mPosition的适配器本身中onItemClick通过位置,然后在getView检查位置== mSelectedPosition决定如何设置视图。如果可以选择多个项目,那么可以在适配器中包含的每个对象上设置一个成员变量。