以前没有怎么在意listview设置选中状态这个问题.但是真当想用的时候,实实在在的发现了一些问题
本来以为只要简单的写个颜色 selector就可以达到目的.后来发现的确是错了
先说下我走过的弯路,本来以为listview的setSelection方法就能把该item设置为选中的高亮状态.没想到这个方法
仅仅只是把该项滑动到屏幕的最顶端而已
先把颜色 selector 以及布局贴一下
/TestListViewSelection/res/values/colors.xml:
<?xml version="1.0" encoding="utf-8"?> <resources> <!-- item背景所需要的颜色值 --> <color name="bg_selected">#ffff0000</color><!-- 红色 --> <color name="bg_pressed">#ffFFB6C1</color><!-- 粉色 --> <color name="bg_normal">#ff00ff00</color><!-- 绿色 --> <!-- item中textview所需要的颜色值 --> <color name="text_normal">#ff000000</color><!-- 黑色 --> <color name="text_pressed">#ffffffff</color><!-- 白色 --> </resources>选中的item的背景selector
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/bg_pressed" android:state_pressed="true"/> <item android:drawable="@color/bg_selected" android:state_selected="true"/> <item android:drawable="@color/bg_pressed" android:state_focused="true"/> <!-- default drawable --> <item android:drawable="@color/bg_normal"/> </selector>选中的item中textview的颜色 selector
/TestListViewSelection/res/color/listview_text_color_selector.xml:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@color/text_pressed" android:state_pressed="true"/> <!-- default drawable --> <item android:color="@color/text_normal" android:state_pressed="false"/> </selector>
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="40dp" android:background="@drawable/listview_color_selector" > <TextView android:id="@+id/txt_item" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:padding="5dp" android:textColor="@color/listview_text_color_selector" android:text="hello" /> </RelativeLayout>
虽然有点击效果,但是全是绿色了,表示不能接受,接下来我们将item的背景设置去掉,把这个selector设置给listview 的 listlistSelector
然后看一下效果图:
现在的确是有点击效果和按压效果,但是往上滑动的话,这个颜色竟然会有一点漏出来,并没有跟随着view一起滚动上去,这有点让人不能接受啊
最后,我采用了在 不给listview设置listSelector 不给listview item的根布局设置背景 以及 item中的textview也不设置颜色selector,而是在adapter的getview
中对他们进行动态的设置,下面看下我们的代码效果:
这个修改了一下selector中默认的颜色
看代码:
package com.example.testlistviewselection; import java.util.List; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.Resources; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; public class ListViewAdapter extends BaseAdapter { private int defaultSelection = -1; private Context mContext; private List<String> list; private int text_selected_color; private int bg_selected_color; private ColorStateList colors; public ListViewAdapter(Context mContext, List<String> list) { // TODO Auto-generated constructor stub this.mContext = mContext; this.list = list; Resources resources = mContext.getResources(); text_selected_color = resources.getColor(R.color.text_pressed);// 文字选中的颜色 bg_selected_color = resources.getColor(R.color.bg_selected);// 背景选中的颜色 colors = mContext.getResources().getColorStateList( R.color.listview_text_color_selector);// 文字未选中状态的selector resources = null; } @Override public int getCount() { // TODO Auto-generated method stub return list == null ? 0 : list.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return list.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewHolder viewHolder = null; if (convertView == null) { viewHolder = new ViewHolder(); convertView = LayoutInflater.from(mContext).inflate( R.layout.item_listview, parent, false); viewHolder.txt_item = (TextView) convertView .findViewById(R.id.txt_item); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.txt_item.setText(getItem(position).toString()); if (position == defaultSelection) {// 选中时设置单纯颜色 viewHolder.txt_item.setTextColor(text_selected_color); convertView.setBackgroundColor(bg_selected_color); } else {// 未选中时设置selector viewHolder.txt_item.setTextColor(colors); convertView.setBackgroundResource(R.drawable.listview_color_selector); } return convertView; } class ViewHolder { TextView txt_item; } /** * @param position * 设置高亮状态的item */ public void setSelectPosition(int position) { if (!(position < 0 || position > list.size())) { defaultSelection = position; notifyDataSetChanged(); } } }我们在adapter的getview中判断当前的position是不是选中的position如果是的话,那就给textview 以及view的背景设置一下单纯的颜色,
如果不是选中的position的话,那就设置给textview 以及 view一个selector,这样就可以让没选中的view有一个按压的效果了
主布局中给listview设置点击监听:
//给listview设置item的点击监听 lv_main.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { adapter.setSelectPosition(position); } });
好吧就到这里了.环境指正和拍砖
源代码:http://download.csdn.net/detail/u010399316/9336323