【问题标题】:How do I check when my ListView has finished redrawing?如何检查我的 ListView 何时完成重绘?
【发布时间】:2015-03-20 18:37:44
【问题描述】:

我有一个ListView。我更新了它的适配器,并致电notifydatasetchanged()。我想等到列表完成绘制,然后在列表上调用 getLastVisiblePosition() 来检查最后一项。

notifydatasetchanged() 之后立即调用getLastVisiblePosition() 不起作用,因为列表尚未完成绘制。

【问题讨论】:

  • 如果您正在更新适配器内容,您是否已经知道最后一项中的内容?还是您真的是指最后一个“可见”项目?
  • 是屏幕上最后一个可见的项目

标签: android listview


【解决方案1】:

希望这可以帮助:

  • 在列表视图上设置addOnLayoutChangeListener
  • 致电.notifyDataSetChanged();
  • 这将在完成后触发 OnLayoutChangeListener
  • 移除监听器
  • 在更新时执行代码(在您的情况下为getLastVisiblePosition()

    mListView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
    
      @Override
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
        mListView.removeOnLayoutChangeListener(this);
        Log.e(TAG, "updated");
      }
    });
    
    mAdapter.notifyDataSetChanged();
    

【讨论】:

  • 它可以工作,但屏幕方向变化很慢。有没有办法加快速度?
  • 速度问题可能与调用.notifyDataSetChanged();时自定义代码触发有关
【解决方案2】:

我认为这个实现可以解决问题。

    // draw ListView in UI thread
    mListAdapter.notifyDataSetChanged();
    
    // enqueue a message to UI thread
    mListView.post(new Runnable() {
        @Override
        public void run() {
            // this will be called after drawing completed
        }
    });

【讨论】:

    【解决方案3】:

    您可以实现回调,在notifyDataSetChanged() 之后它将被调用并完成您需要的工作。这意味着数据已加载到适配器,并且在下一个绘制周期将在 GUI 上可见。这个机制是内置在 Android 中的。见DataSetObserver

    实现他的回调并将其注册到列表适配器中,当您不再需要它时不要忘记取消注册。

    /**
     * @see android.widget.ListAdapter#setAdapter(ListAdapter)
     */
    @Override
    public void setAdapter(android.widget.ListAdapter adapter) {
        super.setAdapter(adapter);
    
        adapter.registerDataSetObserver(new DataSetObserver() {
            @Override
            public void onChanged() {
                onListChanged();
                // ... or do something else here...
                super.onChanged();
            }
        });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 2023-03-22
      • 2021-11-26
      • 2020-08-07
      相关资源
      最近更新 更多