ListView的基本使用技巧

ListView的基本使用技巧html

一、headerView和footerViewjava

二、ViewHolderandroid

三、OnScrollListener異步

四、單行刷新佈局

五、其它細節post


ListView提供headerView和footerView性能



因爲ListView事實上是一個ScrollView。而Android的設計是不建議多個ScrollView包括在一塊兒的。因此列表提供headerview和footerview。優化

使用這兩個需要注意的事項,listView在滑動的時候可能會消耗headerView的事件,表現爲。當點擊headerview的時候,不能及時的響應,緣由是listview可能在滾動。spa

滾動有時候沒有那麼明顯。就給形成點擊不敏感的效果。設計

解決的方法:


可以重載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); 

   不然的話是沒效果的。

 

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

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


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

相關文章
相關標籤/搜索