以前没有怎么在意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);
}
});
这样我们的目的就达到了
好吧就到这里了.环境指正和拍砖