1. 程式人生 > >ListView點選item改變背景,重新選中另一項重新整理,預設是選中第一項的狀態

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中配置:

  1. publicclass MyAdapter extends BaseAdapter{  
  2.  int mSelect = 0;   //選中項
  3.      ......  
  4.  publicvoid 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. }  

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

  1. ...........  
  2. mAdapter = new MyAdapter(...);  
  3. myList.setAdapter(mAdapter);  
  4. //////////點選監聽
  5. myList.setOnItemClickListener(new OnItemClickListener() {  
  6.             @Override
  7.             publicvoid onItemClick(AdapterView<?> parent, View view, int position, long id) {  
  8.                     mAdapter.changeSelected(position);//重新整理
  9.             }......}  
  10. ////////////////選中監聽
  11. myList.setOnItemSelectedListener(new OnItemSelectedListener() {  
  12.             @Override
  13.             publicvoid 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的背景換掉

再次感謝原作者!!!