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

时间:2015-03-20 18:37:44

标签: android listview

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

getLastVisiblePosition()之后立即致电notifydatasetchanged(),因为该列表尚未完成绘制。

3 个答案:

答案 0 :(得分:38)

希望这可以提供帮助:

  • 在listview上设置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();
    

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

您可以实现回调,在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();
        }
    });
}