【问题标题】:How to know when GridView is completely drawn and ready?如何知道 GridView 何时完全绘制并准备就绪?
【发布时间】:2013-01-02 08:49:38
【问题描述】:

我有一个带有自定义适配器的长 GridView,我如何知道 GridView 何时完全显示并准备好?

这是我的代码问题:

dashboard = (GridView) findViewById(R.id.dashboard);
dashboard.setAdapter(new ListItemsAdapter(this, allIcons));
AlertSomeItemsOfTheListView();

在完全绘制 GridView 之前执行方法“AlertSomeItemsOfTheListView”的顺序。

【问题讨论】:

  • 哦!顺便说一句,列表视图有多长?
  • 你没有。 ListView 将仅向适配器询问当前显示的那些项目。
  • 问题是我想使用外部方法更改 ListView 的内容,但是当我将它们写入以下 2 行时,第 2 行在 listView 完成绘制之前执行。
  • @KalpeshLakhani 它实际上是一个 4 行 4 列的 gridview,但是适配器中的 getView 中的代码有时会消耗,因为它会将 TextView 和 ImageView 的外部引用放在 ListItem 中(供外部使用稍后更改其内容的方法)。
  • 好的!哥们理解你的问题。是的,这很关键。顺便说一句,如果您愿意,请尝试延迟加载这种情况。

标签: android android-listview


【解决方案1】:

您可以为您的GridView 获取ViewTreeObserver 实例,并使用它来侦听onLayout 等事件。您可以使用View.getViewTreeObserver() 为您的View 获取ViewTreeObserver。我不确定onLayout 事件是否足以满足您的需要,因为这并不完全意味着View 已完全绘制,但您可以尝试一下。

这里有一个代码示例,您可以使用它来监听onLayout 事件(您可以使用这样的代码,例如在您的ActivityonCreate 方法中):

dashboard.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() {

        @Override
        public void onGlobalLayout() {
            AlertSomeItemsOfTheListView();

            // unregister listener (this is important)
            dashboard.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        }
    });

注意:在调用监听器后注销监听器很重要。如果您不这样做,它将在每个onLayoutevent 上调用,这不是我们想要的(我们希望它只执行一次)。

【讨论】:

  • 对于 V13 + "removeGlobalOnLayoutListener" 已弃用。请改用 removeOnGlobalLayoutListener。
【解决方案2】:

当 GridView/ListView 有适配器时,它会在显示要显示的项目时调用 getView。如果你真的需要在显示所有视图后调用一个方法,你可以这样做......

while(!dashboard.getAdapter().areAllItemsEnabled()){
   //wait
}

AlertSomeItemsOfTheListView();

我不肯定这会奏效,但看看http://developer.android.com/reference/android/widget/GridView.html#getAdapter() 和http://developer.android.com/reference/android/widget/ListAdapter.html 看起来会奏效。

【讨论】:

  • 我找到了一个类似于您的答案“轮询方式”的解决方法(我想要更改的最后一项在 getView 中调用时切换公共布尔值),而我的其他方法休眠 100 毫秒并检查这个布尔值,一旦它被切换,它就会开始改变布局的内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 2023-03-11
  • 2019-09-01
  • 1970-01-01
  • 2015-11-07
  • 2013-06-12
  • 2018-03-11
相关资源
最近更新 更多