当前位置:   article > 正文

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

delphi 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
  • 2
  • 3
  • 4
  • 5

注意:

  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
  • 2
  • 3
  • 4
  • 5
  • 6

注意:

  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代码中的注意点-->
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

方式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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

注意:

  • 这里的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;
            }
        });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

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

另外:

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/170858
推荐阅读
相关标签
  

闽ICP备14008679号