1

谜题~~~我遇到了一个奇怪的问题。那是一旦我的活动初始化,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 还可以?它运作良好,但我的项目很糟糕。

4

1 回答 1

0

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

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

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

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

  • 在我的手机上,ListView两者GridViewgetView()在初始化时调用所有项目,然后getView()再次调用屏幕上的项目。
  • 在我朋友的电话上,只有显示的项目被getView().

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

于 2013-08-18T15:59:09.410 回答