【问题标题】:Reset background color in a ListView在 ListView 中重置背景颜色
【发布时间】:2012-04-13 23:30:40
【问题描述】:

我有一个 ListView,我在其中使用 onListItemClick 事件更改所选项目的背景颜色:

@Override
public void onListItemClick(final ListView l, final View v, final int position, final long id)
{
    v.setBackgroundColor(Color.GRAY);
}

是否可以在更改单个视图的背景颜色之前将 ListView 的所有行重置回原始颜色?问题是每个选定的项目都保留了它们的背景颜色,我只想改变用户点击的最新项目。

更新:

JRaymond 的响应似乎是最好的方法,但是,通常在使用 Android 布局时,我已将代码放入其中,但没有任何反应。没有办法调试它,没有错误消息,什么都没有。我绝对讨厌处理 Android 布局,它是处理 UI 的最复杂、最糟糕的实现设计。

无论如何,这就是我目前所拥有的:

列表视图:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"  
    android:layout_height="fill_parent" 
    > 

        <ListView android:id="@android:id/list"
            android:layout_width="wrap_content"  
            android:layout_height="fill_parent" 
            android:choiceMode="singleChoice"
            android:listSelector="@drawable/listing_selector"           
        />

        <TextView android:id="@android:id/empty"
            android:layout_width="wrap_content"  
            android:layout_height="fill_parent" 
            android:padding="5dp"
        />

</LinearLayout>

listing_selector.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="@android:color/transparent" />
   
   <item android:state_pressed="true" android:drawable="@android:color/transparent" />

   <item android:state_selected="true" android:state_activated="true" android:drawable="@android:color/black" />
   
   <item android:state_activated="true" android:drawable="@android:color/transparent" />    
   
   <item android:state_selected="true" android:drawable="@android:color/transparent" />
   
   <item android:drawable="@android:color/transparent" />
   
</selector>

就像我说的,当我点击项目时什么都没有发生,甚至内置的突出显示也消失了。我什至尝试将所有颜色都更改为黑色,但没有任何反应。

更新 2:

我越来越近了。阅读this文章后,您必须将selector xml 放在res 下名为color 的文件夹中,然后将selector 设置为ListView 中每个项目的布局中的背景,不在ListView 本身:

<?xml version="1.0" encoding="UTF-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"  
    android:layout_height="fill_parent" 
    android:orientation="horizontal"
    android:background="@color/listing_selector"    
>
    <TextView 
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
    />
    
</RelativeLayout>

当我触摸ListView 中的每个项目时,我看到背景颜色变化闪烁,但是它们并没有停留并恢复为原始背景颜色。这是我正在使用的选择器:

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item  android:state_selected="false" android:state_pressed="false" android:drawable="@android:color/transparent" />
    
    <item android:state_pressed="true" android:drawable="@color/blue" />
    
    <item android:state_selected="true" android:state_pressed="false" android:drawable="@color/blue" />

</selector>

颜色.xml:

<?xml version="1.0" encoding="UTF-8"?>

<resources>    
    <color name="blue">#ff33b5e5</color>        
</resources>

这绝对是一件令人头疼的事情。任何想出这种糟糕的 UI 处理系统的人都应该被解雇。

解决方案:

不能 100% 确定,但这可能仅适用于 Android 3.0+ 设备。 state_activated 设置背景颜色。

【问题讨论】:

  • 一切井井有条,您只需阅读文档

标签: android android-listview android-ui


【解决方案1】:

您正在寻找的是 stateListDrawable(也称为选择器)和choiceMode 的组合。

在您的 drawables 文件夹中包含一个类似这样的 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>

然后将列表视图的choiceMode 设置为singleChoice

<ListView
  ...
  android:choiceMode="singleChoice"

这让操作系统为你处理你的背景。

【讨论】:

  • 感谢您的回复。我已经更新了我的 OP,试图实施您的解决方案,但它不起作用。
  • @Kris B,它不起作用,因为它正在寻找 activated 状态,而您没有该条目(本身)。您可以将它与selected 结合使用。在触摸模式下,没有selected(或focused)之类的东西,因此该状态永远不会为真。将包含activated 的状态列表xml 行更改为&lt;item android:state_activated="true" android:drawable="@android:color/black" /&gt;,您应该会得到您想要的效果。
  • 是的,但不应该使用&lt;item android:drawable="@android:color/black" /&gt; 将整个ListView 更改为黑色?这是我的问题,我认为它无法识别任何选择器。
  • @KrisB listSelector 使用不同的机制,我不确定它是什么,但它可能对应于 state_checked 而不是 state_selected。在任何情况下,而不是 listSelector 我通常会膨胀一个自定义 ListItem 来设置背景,所以我没有遇到你所描述的内容。
  • 查看我的 OP,我添加了另一个更新。我越来越近了,只是没有让背景颜色粘住。
【解决方案2】:

一个简单的解决方案是在 onitemclick 中记住项目的单击位置并调用 notifydatachanged() 并在您的自定义适配器的 getView() 中在 retrun 语句之前进行 if 循环比较,如下所示:::

if(postion == itemclickedposition)
    converterView.setBackgroundColor(Color.GRAY);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 2019-11-02
    • 1970-01-01
    • 2023-03-06
    • 2017-01-12
    • 1970-01-01
    • 2011-11-11
    相关资源
    最近更新 更多