赞
踩
如果我们不给LV设置被选中条目的背景色,当条目被选中时默认的是灰色背景,为了更好的UI效果,我们就需要更改一下条目被选中时的背景色。方式有如下三种:
在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>
注意:
使用listSelector设置ListView条目被点击之后的背景色时,selector中只需要给出pressed状态的颜色就可以,不需要给出非按压状态的颜色;
使用listSelector时如果给出了非按压状态的颜色,得到的效果就是:Lv初始化的时候,所有条目背景都是Lv默认的白色;当某个条目被按压的时候,条目背景色变为你设定的pressed状态的颜色,当抬起的时候,就变成了这个selector中设置的非按压状态的颜色,而其他条目还是白色,这种效果并不美观,所以,使用listSelector属性时,只给出一个被选中状态的颜色就可以了
之所以出现上面2 中的状况,是因为,使用android:listSelector后在初始化lv时会给Item设置一个白色的默认背景,不管你在selector里怎么设置都无法改变它的初始背景。
如果想改变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>
注意:
<item android:drawable=“#ff0000"/>
,这样就会报错!!! <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代码中的注意点-->
<?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.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的条目点击事件,当条目被点击的时候,去更改背景色,但这种方法实现起来就没有上面三种简便了,既然有简便的方式,咱们就不再探讨这种麻烦的方法了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。