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