今天在工作中遇到一个需求,一个横版的listview,需要设置item选中之后改变当前item的背景色,重新选择另一个item之后新选择的改变背景,原来的恢复,并且需要设置第一项默认选中,开始想的解决方案是给item的根目录背景设置一个选择器,点击时一种颜色,取消点击一种颜色,但是整了半天也没整出来,感觉思路很乱,找了一下午类似的例子也大都是配置选择器,乱七八糟的看的头晕,后来整理下思路发现应该在adapter上面下功夫,往这方面找了找,发现了这篇文章很给力,就是我要的效果:
=============================================================================================
http://blog.csdn.net/only_tan/article/details/40110993?utm_source=tuicool&utm_medium=referral
点击或选中ListView中的一项后,使item背景改变,失去焦点同样显示选中的背景,重新选中另外一项才刷新;
在Adapter中配置:
[java] view plain copy
- public class MyAdapter extends BaseAdapter{
- int mSelect = 0; //选中项
- ......
- public void changeSelected(int positon){ //刷新方法
- if(positon != mSelect){
- mSelect = positon;
- notifyDataSetChanged();
- }
- }
- public View getView(int position, View convertView, ViewGroup parent) {
- // if(convertView==null){
- LayoutInflater factory = LayoutInflater.from(context);
- View v = (View) factory.inflate(R.layout.list_item, null);
- TextView tv = (TextView) v.findViewById(R.id.Item_tv);
- tv.setText("test");
- // }
- if(mSelect==position){
- v.setBackgroundResource(R.drawable.fc_bg); //选中项背景
- }else{
- v.setBackgroundResource(R.drawable.bg); //其他项背景
- }
- return v;
- }
- }
配置好了之后,下面就是应用:
[java] view plain copy
- ...........
- mAdapter = new MyAdapter(...);
- myList.setAdapter(mAdapter);
- //点击监听
- myList.setOnItemClickListener(new OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- mAdapter.changeSelected(position);//刷新
- }......}
- 选中监听
- myList.setOnItemSelectedListener(new OnItemSelectedListener() {
- @Override
- public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
- mAdapter.changeSelected(position);//刷新
- }......}
====================================================================================================
简单明了,很是感谢
分析了下实现原理:
1、当监听到setOnItemClickListener 点击事件 或者setOnItemSelectedListener 选中事件的时候,
2、执行adapter里面的一个 changeSelected(int positon) 方法,并且把当前点击的position 传递过去
3、adapter里面有一个 int mSelect = 0; //选中项 属性 默认为0 也就是第一项
4、当传过来的position 和选中项不一致时 让选中项mselect 等于当前的选择项 position ,然后调用 notifyDataSetChanged();
5、调用notifyDataSetChanged(); 后,相当于重新执行一次getView()
6、在getView()中 ,将当前的position的背景换掉
再次感谢原作者!!!