ListView的基本使用技巧

ListView的基本使用技巧

1、headerView和footerView

2、ViewHolder

3、OnScrollListener

4、單行刷新

5、其他細節


ListView提供headerView和footerView



因爲ListView其實是一個ScrollView,而Android的設計是不建議多個ScrollView包含在一起的,所以列表提供headerview和footerview。

使用這兩個需要注意的事項,listView在滑動的時候可能會消耗headerView的事件,表現爲,當點擊headerview的時候,不能及時的響應,原因是listview可能在滾動。滾動有時候沒有那麼明顯,就給造成點擊不敏感的效果。

解決辦法:


可以重載onInterceptTouchEvent方法,在這個方法裏面根據條件分發事件。

當然也可以讓列表重寫onTouch方法,在列表的onTouch方法裏面調用Headerview.dispatchTouchEvent方法,而讓HeaderView不接受事件。

ListView設置FooterView和headerView ,在調用setAdapter()之前調。

 

footerView可以單獨寫點擊觸發事件,但是注意最好寫在listview的 OnItemClickListener()裏面,然後根據點擊的位置 

 if(position == mListView.getCount - 1){"觸發footerview點擊事件"} 

如果是單獨給它一個View.onClickListener的話,點擊是可以觸發事件的,但是沒有listview的item按下的變黃色效果。 


android 自定義listview無法響應點擊事件OnItemClickListener 

如果你的自定義ListViewItem中有Button或者Checkable的子類控件的話,那麼默認focus是交給了子控件,而ListView的Item能被選中的基礎是它能獲取Focus,也就是說我們可以通過將ListView中Item中包含的所有控件的focusable屬性設置爲false,這樣的話ListView的Item自動獲得了Focus的權限,也就可以被選中了 

我們可以通過對Item Layout的根控件設置其android:descendantFocusability=”blocksDescendants”即可,這樣Item Layout就屏蔽了所有子控件獲取Focus的權限,不需要針對Item Layout中的每一個控件重新設置focusable屬性了,如此就可以順利的響應onItemClickListener中的onItemClick()方法了。


ViewHolder注意是性能的問題

http://www.360doc.com/content/14/0917/15/15077656_410189820.shtml

這樣寫的問題是異步加載的時候,會出新錯亂。因爲view可能被循環利用了。

解決的辦法網上說有:View.setTag(), listview.findViewWithTag();但是不一定不好使,得看你的Item的佈局。比較好用是的getView。當你異步完成的時候調用getView。


OnScrollListener

列表的滾動監聽

獲取列表滾動的長度:

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0924/1711.html

滾動時候不加載,滾動停止加載

http://www.2cto.com/kf/201405/303570.html


單行刷新

大部分時候,大家用的列表刷新都是notifyDataSetChanged方法,這個方法一般是全部刷新,所以很費勁。當列表很長的時候,你要是刷新一遍就費勁了。getView方法可以單行刷新。所以可以刷新需要變換的,不需要變換的不刷新。


固定列表高的寫法

重寫listview的方法,設置指定的高即可固定列表的高。

setMeasuredDimension(widthMeasureSpec, height | MeasureSpec.AT_MOST);

需要注意的是當固定了列表的高後,列表的加載優化就會失效了,第一次加載的時候,會加載列表高的所有View,這就很費時,需要注意,當列表很長的時候,儘量不使用這種指定了超過屏幕高的列表高的寫法。


android 提供的很多List控件如 listview、gridview 默認都會顯示一個fadingedge的東西,它在View的top和bottom處各顯示一個漸變半透的陰影以達到更好的視覺效果,但是這個帶來的副作用就是導致在性能不是那麼強勁的機器上,一些listview,gridview的拖動會顯得很不流暢,因爲我們知道繪製帶Alpha的圖片是最耗時的。 

我們的優化思路就是對這個fadingedge做一些修改,當view處於滾動狀態時,通過接口setVerticalFadingEdgeEnabled(false)讓其不顯示fadingedge,當view處於靜止狀態時,通過接口setVerticalFadingEdgeEnabled(true)恢復顯示fadingedge。以上的listview和gridview等控件都是繼承與AbsListView,所以我們直接修改framework中的AbsListView.java文件,就可以達到系統級的改動效果了


1.如何取消Listview的滾動條? 

  setVerticalScrollBarEnabled(false)


2.白色的背景,ListView滾屏進行中的時候,背景會變成黑色,解決辦法? 

  android:cacheColorHint="#00000000" 


3.ListView滾動條怎麼一直都顯示? 

  android:fadeScrollbars="false" 


4.ListView隔行變色: 

  int[] colors={Color.BLUE,Color.CYAN}; 

  convertView.setBackgroundColor(colors[position%2]); 


5.ListView中嵌套了checkbox,焦點會到checkbox身上,解決辦法 

  holder.checkBox.setFocusable(false); 


6.listView滾動軸圖片更改? 

   android:scrollbarThumbHorizontal=""   //滾動軸遊標 

   android:scrollbarTrackVertical=""  //滾動軸背景、 

   引用的是9patch圖片 


7.ListView設置EmptyView? 

   mListView.serEmptyView(); 

   Sets the view to show if the adapter is empty這個就是對此方法的描述 

    當listview的adapter爲null的時候,就會顯示所設置的view。 

    需要注意的有兩點:在調用setAdapter()之前調這個方法;設置的emptyview必須放 在listview的直接父佈局裏,比如說listview嵌在一個LinearLayout裏面的話,需要在代碼裏面寫  mLinearLayout.addContentView(你的emptyview); 

   否則的話是沒效果的。

 

8、getFirstVisiblePosition(),該方法獲取當前狀態下list的第一個可見item的position。

9、getLastVisiblePosition(),該方法獲取當前狀態下list的最後一個可見item的position。


10、getItemAtPosition(int position),該方法返回當前狀態下position位置上listView的convertView






發佈了55 篇原創文章 · 獲贊 14 · 訪問量 52萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章