我有一个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时最复杂,最糟糕的设计。
无论如何,这是我到目前为止所做的:
的ListView:
<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>
就像我说的,当我点击项目时没有任何反应,即使内置突出显示已经消失。我甚至尝试将所有颜色改为黑色,但没有任何反应。
UPDATE2:
我越来越近了。阅读this文章后,您必须将selector
xml放在color
下名为res
的文件夹中,然后将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>
color.xml:
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<color name="blue">#ff33b5e5</color>
</resources>
这是什么绝对的痛苦。无论谁想出这个糟糕的系统来处理用户界面都应该被解雇。
解决方案:
不是100%肯定,但这可能仅适用于Android 3.0及更高版本的设备。 state_activated
是设置背景颜色的原因。
答案 0 :(得分:1)
您正在寻找的是stateListDrawable(也称为选择器)和choiceMode的组合。
在你的drawables
文件夹中加入像这样的xml(我使用其他drawable作为我的背景,但颜色也一样):
<?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"
这让操作系统可以为您处理背景。
答案 1 :(得分:0)
只是一个简单的解决方案就是onitemclick只需记住项目的点击位置并调用notifydatachanged()和自定义适配器的getView()就在retrun语句之前,if循环比较如下:::
if(postion == itemclickedposition)
converterView.setBackgroundColor(Color.GRAY);