如何检查我的 ListView 何时完成重绘?

How do I check when my ListView has finished redrawing?

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

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

希望这对您有所帮助:

  • 在列表视图
  • 上设置一个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() 之后它将被调用并完成您需要的工作。这意味着数据已加载到适配器,并且在下一个绘制周期将在 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();
        }
    });
}

我觉得这个实现可以解决问题。

    // 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
        }
    });