如何检查我的 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
}
});
我有一个ListView
。我更新了它的适配器,并调用 notifydatasetchanged()
。我想等到列表完成绘制,然后在列表上调用 getLastVisiblePosition() 来检查最后一项。
在 notifydatasetchanged()
之后立即调用 getLastVisiblePosition()
不起作用,因为列表尚未完成绘制。
希望这对您有所帮助:
- 在列表视图 上设置一个
- 呼叫
.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();
addOnLayoutChangeListener
您可以实现回调,在 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
}
});