根据我的理解,开发人员没有API来确定何时重新绘制AdapterView。
我们打电话给notifyDataSetChanged()
然后,在将来的某个时刻,我们没有任何事情要听,ListView
重新绘制它的观点。
我这样说是因为我遇到了滚动停止时我在ListView中更新图像的情况。
每次我设置一个新的列表来源 - 即从我的适配器调用notifyDataSetChanged()
,然后我调用我的updateImagesInView()
方法 - 有点像这样:
//MyListView.java
public void setDataSource(SomeClass dataSource) {
((MyListAdapter)myListView.getAdapter()).setSomeDataSource(dataSource);
updateImagesInView();
}
public void updateImagesInView() {
for (int i = 0; i <= mListView.getLastVisiblePosition() - mListView.getFirstVisiblePosition(); i++) {
View listItemView = mListView.getChildAt(i);
...
}
}
//MyListAdapater.java
public void setSomeDataSource(SomeClass dataSource) {
mDataSource = dataSource;
notifyDataSetChanged();
}
我从updateImagesInView
方法的循环获得的子视图始终属于以前的dataSource。
我已经入侵了一个解决方法,所以我不是在寻找“如何做到这一点”的答案,但更多的是 - 无论如何都要知道{{1调用ListView
之后实际上已经更新了吗?(或者我只是做了一些疯狂的错误,因为在调用notifyDataSetChanged()
之后应该立即有效地更新视图?)
答案 0 :(得分:1)
您可以为ListView
的布局添加一个监听器,如:
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
时,适配器会调用getView()
来更新当前可见的所有视图。