为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中分别指定点击和没有点击时的颜色。

问题圆满解决。

时间: 2024-07-28 17:03:24

为ListView同时设置点击时的背景和点击松手之后的背景的相关文章

点击EditText可编辑,点击其他地方不可编辑

我是在Fragment中实现的,在网上查了,有的说要回调Activity的onTouch事件,通过实验直接在Fragment中即可.如下: 我的EditText在ScrollView,因为ScrollView本身已经设置onTouch事件,并不抛出,所以必须监听ScrollView的onTouch事件 开始和点击其他地方如图: 点击EditText时如图: 具体代码: EditText:edtTxt_personal_nicknameScrollView:sv_personal 首先设置Edit

Listview 常用设置

最佳实践 listview设置android:descendantFocusability="afterDescendants"或item的根布局设置="blocksDescendants" listview设置android:listSelector="#0000",然后在item的background中设置带选择器的背景 listview设置android:divider="#0000"及android:dividerHe

form中button未设置type值时点击后提交表单

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getS

.net学习之母版页执行顺序、jsonp跨域请求原理、IsPostBack原理、服务器端控件按钮Button点击时的过程、缓存、IHttpModule 过滤器

1.WebForm使用母版页后执行的顺序是先执行子页面中的Page_Load,再执行母版页中的Page_Load,请求是先生成母版页的控件树,然后将子页面生成的控件树填充到母版页中,最后输出 2.WebForm使用母版页进行登录时候的验证 //新建一个页面父类 public abstract class BasePage:Page { protected void Page_Load(object sender, EventArgs e) { //1.身份验证的方法 Session if (Se

从Listview与Button点击事件冲突看安卓点击事件分发机制

题目有点长.其实实现Listview的时候大家都可能会碰到这样的一个问题,那就是Listview的OnItemClickListener点击事件与Button(或者checkbox)的touch(或者click)事件冲突的问题. 声明一下,非常感谢郭大师的这篇blog: http://blog.csdn.net/guolin_blog/article/details/9097463 原理参考了这篇blog,事实上也是本人功力不够不能阅读源码的缺陷啊. 下面说下自己的解决步骤: 1)首先先set一

input,button制作按钮IE6,IE7点击时1px黑边框的解决方法

按钮在IE6中点击时1px黑边框的最常见的解决方法 首先设置按钮为none,然后在按钮外面套一层来实现边框的效果,部分代码如下 .btnbox{ border:solid 1px red;} .btn{ border:none;} <span class="btnbox"><input class="btn" type="button" value="按钮"></span> 第二种办法通过滤

ios8 tableView设置滑动删除时 显示多个按钮

** *  tableView:editActionsForRowAtIndexPath:     //设置滑动删除时显示多个按钮 *  UITableViewRowAction                        //通过此类创建按钮 *  1. 我们在使用一些应用的时候,在滑动一些联系人的某一行的时候,会出现删除.置顶.更多等等的按钮,在iOS8之前,我们都需要自己去实现.但是,到了iOS8,系统已经写好了,只需要一个代理方法和一个类就搞定了 *  2. iOS8的协议多了一个方法

Android ListView 第一次设置Adapter时候getView调用多次

之前遇到这个奇怪现象,记录一下: 使用Listview并设置Adapter时, 会回调多次getView,比如我有4个items,按理说getView应该是调用一次(打出4个log),结果回调有4次(4*4个log). 原因: Listview的layout_height 为自适应:wrap_content,这个情况下,listview没办法确定用多少item的view来填充它自己,这迫使listview多次测量它的子元素. 解决: [html] view plaincopy android:l

ios8 tableView设置滑动删除时显示多个按钮

镔哥,研究很久最后才发现iOS8 TableView出新功能,然后就记下来,供大家参考,为大伙所用. 看我博客都知道,我一向都是喜欢代码注释结合,提供demo给大伙参考,写得不好,不要见怪哦. ** *  tableView:editActionsForRowAtIndexPath:     // 设置滑动删除时显示多个按钮 *  UITableViewRowAction                        // 通过此类创建按钮 *  1. 我们在使用一些应用的时候,在滑动一些联系人