关于GridView:从第一个位置到最后一个位置自动调用getView()

时间:2013-08-18 15:47:46

标签: android call

益智~~~我遇到了一个奇怪的问题。这是我的活动init,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没问题?它运作良好,但我的项目很糟糕。

1 个答案:

答案 0 :(得分:0)

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

  

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

我的情况是,ListView从开始到结束也调用了所有getView()功能,然后再从0到3调用它(对于我的手机,屏幕上有4个项目) )。无论如何,让getView尽可能快地做事总是好的,因为当你滚动GridView时也会调用它,没有人能告诉你将给出哪个位置。

修改 最重要的部分是我放在盒子里的那个。我之前很少使用GridView,但我认为它的行为在ListView上大致相同,因为它们都使用了回收的ViewAdapter。看了你的评论后,我在我的手机和朋友的手机上测试了GridViewListView,并发现了很大的不同:

  • 在我的手机上,ListViewGridView都会在初始化时为所有项目拨打getView(),然后再次呼叫getView()以查看屏幕上的项目
  • 在我朋友的电话上,getView()仅调用显示的项目。

我可以断定它是依赖于操作系统的吗?我的结论是正确的,我相信你不应该将ViewTreeObserver视为你的问题。