利用ListView的基本方法實現效果
日常的開發工作經常需要ListView作為布局的組件,而且很多時候都會遇到需要自定義ListView的情況。
也有些問題并不需要自定義的ListView,基于原生的ListView就能實現,但需要靈活處理Adapter。
我們現在就遇到一個棘手的問題:原本的下拉刷新ListView是單個item的刷新,現在要改成一行兩個item,照道理來講,這應該是一個GridView,但是要考慮兼容以往的下拉刷新效果,要重新定義一個這樣的GridView是比較困難的,因為打算基于原生的ListView進行改造,因為原本的下拉刷新ListView本身就是ListView的子類。
一個明顯的改變就是在Adapter的getCount()。
這個方法返回的是ListView一共要顯示的item的數目,但是因為現在已經改成一行顯示兩個item,所以實際顯示的數目應該除以2的,但考慮到如果數據源是奇數的問題,所以代碼如下:
@Override
public int getCount() {
int size = list.size();
if(size % 2 == 0){
return size / 2;
}else{
return size / 2 + 1;
}
}
然后我們在處理getView的時候必須要注意,現在這個position代表的意思和以前不一樣。
以前的position為0的時候,表示是第一個元素,但這里我們在getCount里面處理過了,所以返回0其實是表示返回第一個和第二個元素。
如果position為0,取的是0和1,如果為1,取的是2和3,為2,取的是4和5。。。以此類推,我們在取的時候,要position * 2和position * 2 + 1,表示取出一行左邊和右邊的item的數據。
我們必須注意奇數時候取到最后一個數據的情況。
我們可以判斷position * 2 + 1是否小于數據的數量,如果大于,說明是取到最后一個數據了,就要隱藏掉右邊的Item。
這樣我們就實現了一個ListView一行顯示兩列的情況。
涉及到getCount中的修改,一般都是類似這種,一行顯示多個item的情況,但是我們并不建議在處理類似的情況的時候搞得這么復雜,如果能夠用GrideView或者RecyclerView就用,如果是類似我們這種,因為之前的業務關系,導致必須在已有的ListView上修改,就可以采取這種做法。
ListView作為一個可滑動的控件,有很多效果都要求在滑到某個位置時候要做出某種響應。這類效果的實現可以很復雜,也可以稍微簡單,視具體情況而言。
我們遇到的需求是要求ListView在某個控件滑出屏幕的時候,標題欄要顯示某個控件。
這個需求并不算是特別復雜,我們只要判斷滑出屏幕的控件的坐標位置就行。
所有可以滑動的控件的滑動監聽都可以在onScroll方法里。
要判斷某個控件是否滑出屏幕,我們先要知道屏幕的范圍。
1 Point p = new Point();
2 getWindowManager().getDefaultDisplay().getSize(p);
3 int screenWidth = p.x;
4 int screenHeight = p.y;
5 Rect rect = new Rect(0, 0, screenWidth, screenHeight);
這個Rect就是屏幕的坐標范圍。
然后我們獲取某個控件的坐標范圍。
int[] location = new int[2];
view.getLocationInWindow(location);
這個控件的坐標范圍就放在location里面。
然后我們判斷某個控件是否在某個范圍可見,也就是Rect內可見,可以調用這個方法:
view.getLocalVisibleRect(rect)
任何復雜的效果,都是建立在基礎控件的基本屬性和方法上,雖然實現上會比較瑣屑,但是我們看到的那些簡單的方法調用,其封裝的實現也是很瑣屑的。
Android中涉及到控件的一些特別效果,尤其是涉及到坐標變化,都需要我們特別細心的對待,只要找到思路,還是有方法實現的。
來自:http://www.cnblogs.com/wenjiang/p/6031330.html