【问题标题】:About GridView: getView() auto called from first position to last关于 GridView:getView() 自动从第一个位置调用到最后一个位置
【发布时间】:2013-08-18 15:47:45
【问题描述】:

谜题~~~我遇到了一个奇怪的问题。那是一旦我的活动初始化,gridView 将调用 getView() 方法来初始化其中的所有项目。但是我没有做任何事件,我什至没有触摸屏幕,但gridview确实将图片从第一个位置加载到最后一个位置。这是我的日志:

D/LocalGridViewAdapter(20843): getView() called at :0
D/LocalGridViewAdapter(20843): getView() called at :0
D/LocalGridViewAdapter(20843): getView() called at :1
D/LocalGridViewAdapter(20843): getView() called at :2
D/LocalGridViewAdapter(20843): getView() called at :3
D/LocalGridViewAdapter(20843): getView() called at :4
       .....................................
D/LocalGridViewAdapter(20843): getView() called at :564
D/LocalGridViewAdapter(20843): getView() called at :565

我认为这是由 ViewTreeObserver 引起的,但我确实需要它来调整 gridview 项目的布局,使图片看起来更漂亮。这是我的 ViewTreeObserver 的代码,来自 Google bitmapFun Projext:

gv.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if (mAdapter.getNumColumns() == 0) {
                final int numColumns = (int) Math.floor(gv.getWidth()
                    / (GlobalConstants.mImageThumbSize 
                    + GlobalConstants.mImageThumbSpacing));
                if (numColumns > 0) {
                    final int columnWidth = (gv.getWidth() / numColumns)
                        - GlobalConstants.mImageThumbSpacing;
                    GlobalConstants.reqSize = columnWidth;
                    mAdapter.setNumColumns(numColumns);
                    mAdapter.setItemHeight(columnWidth);
                    Log.d("~~~~~~~~~~~",
                        "onCreateView - numColumns set to " + numColumns);
                }
            }
        }
    });

我只是怀疑为什么 Bitmapfun 还可以?它运作良好,但我的项目很糟糕。

【问题讨论】:

    标签: android call


    【解决方案1】:

    已经有很多人在 SO 上询问过这个问题。我也在使用我的自定义适配器使用 ListView。我可以向你保证,

    对于任何给定位置调用 getView() 的次数绝对不能保证

    我的情况,ListView 也从头到尾调用了所有 getView() 函数,然后从 0 到 3 再次调用它(在我的手机上,屏幕上有 4 个项目)。不管怎样,让你的getView做事尽可能快总是好的,因为当你滚动你的GridView时它也会被调用,没有人能告诉你会给出哪个位置。

    编辑: 最重要的部分是我放在盒子里的那个。我以前很少使用GridView,但我想它的行为在ListView 上基本相同,因为它们都使用回收的Views 和Adapter。看了你的评论,我在我的手机和我朋友的手机上测试了GridViewListView,发现有很大的不同:

    • 在我的手机上,ListViewGridView 在初始化时都调用 getView() 获取所有项目,然后再次调用 getView() 获取屏幕上的项目。
    • 在我朋友的手机上,getView() 只呼叫了显示的项目。

    我可以断定它依赖于操作系统吗?而且我的结论是正确的,我相信您不应该将ViewTreeObserver 考虑到您的问题中。

    【讨论】:

    • E,,如果我删除GridView的ViewTreeObserver,并给它一个固定的dp或像素,一旦它启动它就不会从第一个到最后一个调用getView。但我想使用观察者来改变 gridView 项目的大小,以适应不同的屏幕。而在 Google 的 BitmapFun 项目中,它使用了观察者来做到这一点,但它没有遇到这个问题。我只是无法弄清楚
    • 我只是好奇,因为我的手机和你说的不一样。所以我借了我朋友的手机(Android 4.2),我的是4.0.4。我根据结果编辑我的答案。
    • 我只是不想让它这样做,因为有 500 多张图片,加载它们需要很长时间。只需在当前屏幕上加载图像~这就是我想要的
    猜你喜欢
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多