2013-12-12 30 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()内的任何逻辑(例如,设置图像视图等)被一次又一次地执行。