利用ListView的基本方法實現效果

gnil4338 8年前發布 | 12K 次閱讀 ListView Android開發 移動開發

日常的開發工作經常需要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

 

 本文由用戶 gnil4338 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!