了解何时在调用notifyDataSetChanged()后实际重新绘制ListView视图

时间:2014-08-22 18:08:28

标签: android listview

根据我的理解,开发人员没有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()之后应该立即有效地更新视图?)

1 个答案:

答案 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()来更新当前可见的所有视图。