2013-12-12 71 views
5

Android GridView很有意思,它重用了子視圖。滾動的那些從底部回來。因此,GridView沒有方法通過其位置獲取子視圖。但我真的需要從自己的立場來看待問題並做一些工作。所以爲此,我創建了一個SparseArray,並從getViewBaseAdapter中將它們的位置置於其中。GridView按位置查看,第一個子視圖不同

SparseArray<View> ViewArray = new SparseArray<View>(); 

public View getView(int position, View convertView, ViewGroup parent) { 
    View view = convertView;  
    if (view == null) 
     view = li.inflate(layoutID, null); 
    ViewArray.put(position, view); 
} 

現在,我可以通過他們的位置獲得所有可見的視圖。一切都完美無缺,但在某些設備中,第一個子視圖(位置0)與陣列中的不一樣。我登錄了getView,發現對於位置0,getView被多次調用,並且每次數組都被設置爲不同的視圖。我不知道爲什麼GridView多次調用位置0的getView,並且只發生在少數設備上。任何解決方案

回答

5

閱讀getPositionForView源之後,我寫了個是在自己的GridView中的方法,通過API完美工作18

public View GetViewByPosition(int position) { 
    int firstPosition = this.getFirstVisiblePosition(); 
    int lastPosition = this.getLastVisiblePosition(); 

    if ((position < firstPosition) || (position > lastPosition)) 
     return null; 

    return this.getChildAt(position - firstPosition); 
} 
1

由於回收利用,您無法直接看到視圖。位置0的視圖可以重新用於位置10,因此您無法確定特定視圖中的數據。

要走的路是使用基礎數據。如果需要修改位置10處的數據,請在適配器下的列表或陣列中執行此操作,並在適配器上調用notifyDataSetChanged()

,如果你需要爲不同的數據亞型不同的看法,我們可以覆蓋在你的適配器以下兩種方法:getItemViewType()getViewTypeCount()

然後,在getView()您可以1)決定膨脹2的佈局)知道來看回收利用getItemViewType()

您可以在這裏找到一個例子類型: https://stackoverflow.com/a/5301093/990616

0

有一個報告的問題。這裏是link。此問題已作爲WorkingAsIntended被關閉。 Wish意味着我們可以期望GridView在pos 0上多次調用getView()。

我的解決方法是如下:

public class GridAdapter extends BaseAdapter { 
    ... 
    int previouslyDisplayedPosition = -1; 
    ... 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    if(previouslyDisplayedPosition != position) { 
     .... 

     previouslyDisplayedPosition = position; 
    } 

    return convertedView; 
    } 

我想在這裏做的是返回相同的「convertView」如果同一POS是一次又一次地叫。通過阻止getView()內的任何邏輯(例如,設置圖像視圖等)被一次又一次地執行。