我有ListView
。我更新了它的适配器,然后调用notifydatasetchanged()
。我想等到列表完成绘制,然后调用列表上的getLastVisiblePosition()来检查最后一项。
在getLastVisiblePosition()
之后立即致电notifydatasetchanged()
,因为该列表尚未完成绘制。
答案 0 :(得分:38)
希望这可以提供帮助:
在更新时执行代码(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();
}
});
}