首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GridView.getFirstVisiblePosition()错误

GridView.getFirstVisiblePosition()错误
EN

Stack Overflow用户
提问于 2011-05-19 03:20:58
回答 1查看 3.5K关注 0票数 0

我有一个GridView,每行有4个图像,通常比一次在屏幕上容纳的5行稍微少一些。

最初,每次我重新生成它的内容时,它都会重新设置到顶部。因此,我从一个关于ListAdapter的帖子中获得了一个提示,并得出如下结论:

  • 在重新生成GridView之前,我注意到当前getFirstVisiblePosition()的值。
  • 重新生成它之后,用前面从getFirstVisiblePosition()获得的值调用getFirstVisiblePosition()。

问题是,每次我重新生成GridView时,它都会向后滚动一行,直到到达顶部。无论出于什么原因,如果第一行或第二行是可见的第一行,则返回0,然后返回n-4 (每行有4项)。

示例:

第1行是第一个可见行:返回0

第2行是第一个可见行:返回0

第3行是第一个可见行:返回4

第4行是第一个可见行:返回8

第二个问题是,如果用户没有将setSelection()放在正确的位置,那么对它的第一个调用就会使它停止运行。有没有办法问安卓,“当前的GridView被用户滚动了多少像素”,然后告诉它,“将这个新呈现的GridView向下滚动N个像素”,这样元素的内容可能会发生变化,但是网格本身会看起来稳定,并保持在更新之前用户保留的位置?

示例代码:

代码语言:javascript
复制
// (uList = List<User>;)

// see what the current gridview's top position is
// returns 0 for rows zero and one,
// returns n-4 for rows two and beyond (n = row x 4)
int idx = gridview.getFirstVisiblePosition();

gridview.setAdapter(new ImageAdapter(TabViewActivity.this, uList));
// ImageAdapter is subclass of BaseAdapter
// if it matters, it's populating View with slightly-hacked Droid-Fu 
// WebImageView objects (the official version doesn't support overlaying
// bitmaps, and has its own LayoutParams hardcoded).

// restore the previous incarnation's top position
// the "+4" is a nasty hack to make it sort of work for all rows but the first 
gridview.setSelection(idx+4);


public class ImageAdapter extends BaseAdapter {
    // ...
    public View getView(int position, View v, ViewGroup parent) {
        User u = userList.get(position); 
        LayoutParams lp = new LayoutParams(70,70);
        lp.gravity = Gravity.CENTER;
        IBitmapFilter filter = new UserBitmapFilter(u, overlays);
        StyledWebImageView w = new StyledWebImageView(context, u.getIconUrl(app), true, lp, filter);
        w.setTag(u);
        return w;
    }
}

更新:公认的答案并不能说明全部情况,但无论如何帮助我解决了问题。

最后,我通过重用ImageAdapter对象来解决这个问题,而不是每次底层内容改变时都生成一个新的对象。它解决了问题。上述所有代码基本上由以下代码取代:

代码语言:javascript
复制
if (gridviewImageAdapter.update(uList))
    gridviewImageAdapter.notifyDataSetChanged();

并向ImageAdapter类添加一个方法:

代码语言:javascript
复制
public boolean update(List<User> uList) {
   // make backup copy of the old list
   // replace the values
   // compare old and new lists, return true if different.
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-19 03:46:41

您只需要在notifyDataSetChanged()上调用Adapter来反映驱动列表的数据中的变化。

你是如何重建景观的?

听起来你是在反对这个框架,而不是在使用它。看看这段视频,它帮助解释了很多关于ListView和更新来自Adapter的视图的内容,我发现它真的很有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6053384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档