Android ListView 設置選中item高亮狀態

以前沒有怎麼在意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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章