您的位置:首页 > 移动开发 > Android开发

Android ListView 设置选中item高亮状态

2015-12-08 11:59 567 查看
以前没有怎么在意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

/TestListViewSelection/res/drawable/listview_color_selector.xml:

<?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>


然后我们给listview的item的根布局设置selector,item中的textview设置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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: