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