【问题标题】:onItemClick in ListView randomly changes the background colorListView中的onItemClick随机改变背景颜色
【发布时间】:2012-04-15 01:40:38
【问题描述】:

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

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

【问题讨论】:

  • 如果这样 v.setBackgroundColor() 不起作用,您是否使用 ArrayAdapter

标签: android listview background-color


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    比上述建议更好的是使用选择器,也称为状态列表可绘制对象。这样,操作系统就可以处理所有的颜色突出显示等事务。

    更明确地说,获取以下 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中All ListItems的背景设置为R.drawable.li_background。如果您的 listView 已正确配置为进行多项选择(android:choiceMode="multipleChoice"listView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);,如果您愿意),那么 android 将负责其余的工作。这些东西没有很好的记录,我很难找到解决方案,而且我一直看到类似的问题,但相关的 dos 是 herehere

    【讨论】:

      【解决方案3】:

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

      因此,您永远不应在支持ListView 的适配器的getView 方法之外设置给定行的View 中任何内容的属性。

      您可以通过多种方式处理此问题,但基本思想是您希望设置一些数据,该数据使用传递给onItemClickposition 来设置标志。然后检查 Adapter 的 getView 中的标志来决定如何为行的 View 设置背景。

      例如,如果只能选择一项,则可以只设置一个成员变量,例如 Adapter 本身上的 mPosition 到传递给 onItemClick 的位置,然后检查 getView if position = = mSelectedPosition 来决定如何设置View。如果可以选择多个项目,也许您在 Adapter 中包含的每个对象上设置一个成员变量。

      【讨论】:

        【解决方案4】:

        您可能应该覆盖适配器中的 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);
        }
        

        【讨论】:

          【解决方案5】:

          在 onItemClick() 中只使用 adapter.notifyDataChange();还设置一个标志为真;

          在您的 CustomAdapter 的 getView() 中使用布尔标志来了解该行是否被选中。 然后只需检查该标志并根据需要继续 IE。, 如果(标志){ v.setBackgroundColor(Color.parseColor("#80B7DBE8")); }别的{ v.setBackgroundColor(Color.parseColor("#FF0000")); }

          【讨论】:

            猜你喜欢
            • 2018-11-25
            • 2013-10-14
            • 2017-03-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-04-15
            相关资源
            最近更新 更多