以前沒有怎麼在意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>
<?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);
}
});
這樣我們的目的就達到了
好吧就到這裏了.環境指正和拍磚