Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android GridView按位置获取视图,第一个子视图不同_Android_Gridview - Fatal编程技术网

Android GridView按位置获取视图,第一个子视图不同

Android GridView按位置获取视图,第一个子视图不同,android,gridview,Android,Gridview,AndroidGridView非常有趣,它重用了子视图。向上滚动的从底部返回。因此,GridView中没有通过位置获取子视图的方法。但我真的需要通过它的位置来获取视图,并对其进行一些处理。为此,我创建了一个SparseArray,并从BaseAdapter的getView中按视图在其中的位置放置视图 SparseArray<View> ViewArray = new SparseArray<View>(); public View getView(int positio

Android
GridView
非常有趣,它重用了子视图。向上滚动的从底部返回。因此,
GridView
中没有通过位置获取子视图的方法。但我真的需要通过它的位置来获取视图,并对其进行一些处理。为此,我创建了一个
SparseArray
,并从
BaseAdapter
getView
中按视图在其中的位置放置视图

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);
}
SparseArray视图数组=新SparseArray();
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=转换视图;
如果(视图==null)
视图=li.充气(layoutID,null);
ViewArray.put(位置、视图);
}

现在,我可以通过它们的位置获得所有可见视图。一切工作都很完美,但在某些设备中,第一个子视图(位置0)与阵列中的视图不同。我记录了
getView
,发现对于位置0,
getView
被调用了很多次,每次数组都设置了不同的视图。我不知道为什么GridView多次调用位置0的
getView
,而这种情况只在少数设备上发生。有什么解决方案吗?

由于回收,您无法直接访问视图。位置0处的视图可能会重新用于位置10,因此您无法确定特定视图中存在的数据

方法是使用底层数据。如果需要修改位置10处的数据,请在适配器下的列表或数组中进行修改,并在适配器上调用
notifyDataSetChanged()

如果需要为不同的数据子类型创建不同的视图,可以在适配器中重写以下两种方法:
getItemViewType()
getViewTypeCount()

然后,在
getView()
中,您可以1)决定要充气的布局2)使用
getItemViewType()

您可以在此处找到一个示例:

在阅读了
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);
}
公共视图GetViewByPosition(int位置){
int firstPosition=this.getFirstVisiblePosition();
int lastPosition=this.getLastVisiblePosition();
如果((位置<第一位置)| |(位置>最后位置))
返回null;
返回此.getChildAt(position-firstPosition);
}

报告了此问题。这是你的电话号码。此问题已在工作结束时关闭。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;
   }
我在这里试图做的是,如果反复调用相同的pos,则返回相同的“
convertView
”。通过防止
getView()
中的任何逻辑(如设置图像视图等)被反复执行,可以实现此功能