天天看點

ListView點選item改變背景,重新選中另一項重新整理,預設是選中第一項的狀态

今天在工作中遇到一個需求,一個橫版的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

  1. public class MyAdapter extends BaseAdapter{  
  2.  int mSelect = 0;   //選中項  
  3.      ......  
  4.  public void changeSelected(int positon){ //重新整理方法  
  5.      if(positon != mSelect){  
  6.       mSelect = positon;  
  7.      notifyDataSetChanged();  
  8.      }  
  9.     }  
  10. public View getView(int position, View convertView, ViewGroup parent) {  
  11. //     if(convertView==null){  
  12.         LayoutInflater factory = LayoutInflater.from(context);  
  13.         View v = (View) factory.inflate(R.layout.list_item, null);  
  14.         TextView tv = (TextView) v.findViewById(R.id.Item_tv);  
  15.         tv.setText("test");  
  16. //     }  
  17.         if(mSelect==position){      
  18.          v.setBackgroundResource(R.drawable.fc_bg);  //選中項背景  
  19.         }else{  
  20.          v.setBackgroundResource(R.drawable.bg);  //其他項背景  
  21.         }  
  22.         return v;  
  23.     }  
  24. }  

配置好了之後,下面就是應用:

[java]  view plain  copy

  1. ...........  
  2. mAdapter = new MyAdapter(...);  
  3. myList.setAdapter(mAdapter);  
  4. //點選監聽  
  5. myList.setOnItemClickListener(new OnItemClickListener() {  
  6.             @Override  
  7.             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
  8.                     mAdapter.changeSelected(position);//重新整理  
  9.             }......}  
  10. 選中監聽  
  11. myList.setOnItemSelectedListener(new OnItemSelectedListener() {  
  12.             @Override  
  13.             public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {  
  14.                                 mAdapter.changeSelected(position);//重新整理  
  15.             }......}  

====================================================================================================

簡單明了,很是感謝

分析了下實作原理:

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的背景換掉

再次感謝原作者!!!