【问题标题】:GridView get view by position, first child view differentGridView按位置获取视图,第一个子视图不同
【发布时间】:2016-08-10 18:08:53
【问题描述】:

Android GridView 很有趣,它重用了子视图。向上滚动的那些从底部返回。因此,GridView 没有任何方法可以通过其位置获取子视图。但我真的需要通过它的位置来了解它并做一些工作。为此,我创建了一个SparseArray,并根据他们的位置从getViewBaseAdapter 中放置视图。

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 并且这只发生在少数设备上。有什么解决办法吗?

【问题讨论】:

    标签: android gridview


    【解决方案1】:

    阅读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);
    }
    

    【讨论】:

      【解决方案2】:

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

      要走的路是使用基础数据。如果需要修改位置 10 的数据,请在适配器下的 List 或数组中进行,并在适配器上调用 notifyDataSetChanged()

      如果您需要为不同的数据子类型提供不同的视图,您可以在您的适配器中覆盖以下两个方法:getItemViewType()getViewTypeCount()

      然后,在getView() 中,您可以 1) 决定要膨胀的布局 2) 知道使用 getItemViewType() 回收的视图类型

      你可以在这里找到一个例子: https://stackoverflow.com/a/5301093/990616

      【讨论】:

        【解决方案3】:

        报告了一个问题。这是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;
           }
        

        如果一次又一次地调用相同的 pos,我在这里尝试做的是返回相同的 'convertView'。通过防止getView() 中的任何逻辑(例如设置图像视图等)一次又一次地执行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-02
          • 1970-01-01
          • 2014-09-08
          相关资源
          最近更新 更多