今天在工作中遇到一個需求,一個橫版的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的背景換掉
再次感謝原作者!!!