欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现为ListView同时设置点击时的背景和点击松手之后的背景

程序员文章站 2022-06-23 10:29:14
本文实例讲述了android实现为listview同时设置点击时的背景和点击松手之后的背景。分享给大家供大家参考。具体分析如下: 这里要达到的效果是, (1)点击lis...

本文实例讲述了android实现为listview同时设置点击时的背景和点击松手之后的背景。分享给大家供大家参考。具体分析如下:

这里要达到的效果是,

(1)点击listview的item时会有指定的背景,

(2)松手之后,刚才点击的item也会有指定的背景

实现(1)很简单:在xml中为listview设置listselector即可。

复制代码 代码如下:
<listview 
android:id="@+id/pop_listview_left" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:scrollbars="none" 
android:divider="@color/popup_left_bg" 
android:dividerheight="1dp" 
android:listselector="@color/popup_right_bg" 
android:scrollingcache="false" 
/>

实现(2)也很简单,在adapter中动态改变背景:

复制代码 代码如下:
if (position == selectedposition){ 
    convertview.setbackgroundresource(r.color.left_selected);
}else{ 
    convertview.setbackgroundresource(r.color.left_normal);
}

并且在该listview的点击事件中及时更新selectedposition:
复制代码 代码如下:
leftlv.setonitemclicklistener(new adapterview.onitemclicklistener() {
@override 
public void onitemclick(adapterview<?> parent, view view, int position, long id) {
 //更新背景色 
 firstclassadapter adapter = (firstclassadapter) (parent.getadapter()); 
 adapter.setselectedposition(position); 
 adapter.notifydatasetchanged(); 
    } 
});

可是,问题出来了:设置了(2)之后,(1)的效果没了!!!
这是因为,在设置

复制代码 代码如下:
convertview.setbackgroundresource(r.color.left_selected);
 
时,(1)中listselector中指定的颜色会被覆盖。

解决方法有两种:

(一)

将convertview的一个纯色的背景改为一个selector,并设置其在点击时的颜色为透明(这样下面listselector的颜色就露出来了)。以下是selector_left_normal.xml和selector_left_selected.xml.

复制代码 代码如下:
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" 
        android:drawable="@android:color/transparent"/> 
 
    <item android:state_pressed="false" 
        android:drawable="@color/popup_left_bg"/> 
</selector> 

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" 
        android:drawable="@android:color/transparent"/> 
 
    <item android:state_pressed="false" 
        android:drawable="@color/popup_right_bg"/> 
</selector>

然后将(2)中的代码改为:

复制代码 代码如下:
if (position == selectedposition){ 
    convertview.setbackgroundresource(r.drawable.selector_left_selected); 
}else{ 
    convertview.setbackgroundresource(r.drawable.selector_left_normal); 
}

(二)

参照(一),将listview的listselector属性去掉,并将其颜色复制到上面两个selector中替换transparent那个颜色。

也就是说,每次点击listview的条目之后,设置背景色时,

(a)如果该条目现在是选中状态,则直接设为某一个颜色

(b)否则,将其颜色设置为一个selector,并在selector中分别指定点击和没有点击时的颜色。

问题圆满解决。

希望本文所述对大家的android程序设计有所帮助。