Android GridView
非常有趣,它重用了子视图。向上滚动的那些从底部返回。因此,GridView
没有方法可以通过其位置获取子视图。但我真的需要通过它的立场来看待并做一些工作。为此,我创建了SparseArray
并根据getView
BaseAdapter
中的位置放置了观看次数。
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
,而这只发生在少数设备上。任何解决方案?
答案 0 :(得分:6)
在阅读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 :(得分:1)
由于回收,您无法直接查看视图。位置0处的视图可以重新用于位置10,因此您无法确定特定视图中的数据。
要采用的方法是使用基础数据。如果需要修改位置10的数据,则在适配器下的列表或数组中执行此操作,并在适配器上调用notifyDataSetChanged()
。
如果您需要为不同的数据子类型设置不同的视图,则可以在适配器中覆盖以下两种方法:getItemViewType()
和getViewTypeCount()
然后,在getView()
中您可以1)确定要扩张的布局2)了解使用getItemViewType()
回收的视图类型
你可以在这里找到一个例子: https://stackoverflow.com/a/5301093/990616
答案 2 :(得分:1)
为此报告了一个问题。这是link。此问题已作为WorkingAsIntended关闭。希望意味着我们可以期望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;
}
我在这里要做的是返回相同的&#39; convertView
&#39;如果一次又一次地调用相同的pos。通过防止getView()
内的任何逻辑(例如设置图像视图等)一次又一次地执行。