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

    平常的開發工做常常須要ListView做爲佈局的組件,並且不少時候都會遇到須要自定義ListView的狀況。ide

    也有些問題並不須要自定義的ListView,基於原生的ListView就能實現,但須要靈活處理Adapter。佈局

    咱們如今就遇到一個棘手的問題:本來的下拉刷新ListView是單個item的刷新,如今要改爲一行兩個item,照道理來說,這應該是一個GridView,可是要考慮兼容以往的下拉刷新效果,要從新定義一個這樣的GridView是比較困難的,由於打算基於原生的ListView進行改造,由於本來的下拉刷新ListView自己就是ListView的子類。spa

    一個明顯的改變就是在Adapter的getCount()。code

    這個方法返回的是ListView一共要顯示的item的數目,可是由於如今已經改爲一行顯示兩個item,因此實際顯示的數目應該除以2的,但考慮到若是數據源是奇數的問題,因此代碼以下:blog

   @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實際上是表示返回第一個和第二個元素。get

     若是position爲0,取的是0和1,若是爲1,取的是2和3,爲2,取的是4和5。。。以此類推,咱們在取的時候,要position * 2和position * 2 + 1,表示取出一行左邊和右邊的item的數據。it

     咱們必須注意奇數時候取到最後一個數據的狀況。io

     咱們能夠判斷position * 2 + 1是否小於數據的數量,若是大於,說明是取到最後一個數據了,就要隱藏掉右邊的Item。class

     這樣咱們就實現了一個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中涉及到控件的一些特別效果,尤爲是涉及到座標變化,都須要咱們特別細心的對待,只要找到思路,仍是有方法實現的。

相關文章
相關標籤/搜索