更改ListView中被选中条目背景色的三种方式

如果我们不给LV设置被选中条目的背景色,当条目被选中时默认的是灰色背景,为了更好的UI效果,我们就需要更改一下条目被选中时的背景色。方式有如下三种:

  1. 使用ListView的listSelector属性,
  2. 在ListView条目布局xml中设置background
  3. 在BaseAdapter的getView方法中,通过setBackgroundResource( )方法设置Lv条目背景色

    以上无论是哪种方式,都需要先定义一个selector,但稍有区别,具体代码如下:

<!--使用ListView的listSelector属性时用的selector选择器的代码:-->
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/colorAccent" android:state_pressed="true"/>
</selector>

注意:

  1. 使用listSelector设置ListView条目被点击之后的背景色时,selector中只需要给出pressed状态的颜色就可以,不需要给出非按压状态的颜色;

  2. 使用listSelector时如果给出了非按压状态的颜色,得到的效果就是:Lv初始化的时候,所有条目背景都是Lv默认的白色;当某个条目被按压的时候,条目背景色变为你设定的pressed状态的颜色,当抬起的时候,就变成了这个selector中设置的非按压状态的颜色,而其他条目还是白色,这种效果并不美观,所以,使用listSelector属性时,只给出一个被选中状态的颜色就可以了

  3. 之所以出现上面2 中的状况,是因为,使用android:listSelector后在初始化lv时会给Item设置一个白色的默认背景,不管你在selector里怎么设置都无法改变它的初始背景。

  4. 如果想改变lv初始化时Item的默认背景,只能通过下面的方式2 和方式3, 也就是在条目布局或者getView方法中设置

<!--设置ListView条目背景时使用的selector,这种方式可以给出默认和按下时不同的图片-->
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/colorAccent" android:state_pressed="true"/>
    <item android:drawable="@color/colorPrimary"/>
</selector>

注意:

  1. 如果,selector中item的drawable属性想直接使用颜色值,就必须先把这个颜色值定义在color文件中,然后再引用;如果此处直接写成 <item android:drawable=“#ff0000"/>,这样就会报错!!!

方式1 使用ListView的listSelector设置条目被选中时更改背景色

 <ListView android:id="@+id/lv"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:layout_marginTop="10dp"
              android:cacheColorHint="@android:color/transparent"
              android:divider="@mipmap/ic_launcher"
              android:dividerHeight="5dp"
              android:listSelector="@drawable/selector_listview"/>
<!--注意:这里使用的selector是只给出了按压状态取值的selector,具体原因看上面selector代码中的注意点-->

方式2 直接在ListView的条目布局中设置条目的background

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="match_parent"
             android:layout_height="wrap_content">
    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="@drawable/selector_listview"
        android:gravity="center"/>
</FrameLayout>

注意:

  • 这里的lv条目布局只是一个TextView , 为了让TextView的layout_height=40dp生效,就需要在外面包一层布局,这里使用的是FrameLayout,(用其他布局包裹也行);如果不包裹这层布局的话,这个高度将无法生效,得到的就是wrap_content的高度效果

方式3 在Adapter的getView( )中通过setBackgroundResource( )设置条目的背景色

 lv.setAdapter(new BaseAdapter() {
            @Override
            public int getCount() {
                return list.size();
            }

            @Override
            public Object getItem(int position) {
                return list.get(position);
            }

            @Override
            public long getItemId(int position) {
                return position;
            }

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                if (convertView == null) {
                    convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.item, null);
                }

                TextView tv = (TextView) convertView.findViewById(R.id.tv);
                tv.setText(list.get(position) + "abcdef");
                tv.setBackgroundResource(R.drawable.selector_listview);
                return convertView;
            }
        });

第三种方式没有什么特别的,就是在adapter的getView()方法中,查找相应条目布局控件,然后设置一个背景为selector即可; 这里用的时setBackgroundResources(),直接传入drawable的id即可,如果是setBackground()的话,就必须传入一个Drawable图形

另外:

其实,还有一中方式,就是监听ListView的条目点击事件,当条目被点击的时候,去更改背景色,但这种方法实现起来就没有上面三种简便了,既然有简便的方式,咱们就不再探讨这种麻烦的方法了

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CnPeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值