RecyclerView绑定View时更新数据问题解决

线上版本报了一个很奇怪的异常Java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling at android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll
看到这个确实是源码里抱出来的,查了很久后来发现: 在 bindView 的时候不能直接调用 notify 更新 view,如果在 bindView 的时候直接调用notify 的操作,就会出现上边异常。
解决方案:
将 notify 的操作放置到Runnable 队列里去执行,以保证本次 notify 执行完成后再执行下一次 notify 的操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Override
public void onBindFooter(BaseRecyclerViewHolder holder, Integer footerData) {
PageAdapter<T, HD> adapter = getAdapter();
if (adapter != null && adapter.getFooterData() != null && adapter.getFooterData() == BaseFooterHolder.TYPE_LOADING) {
//加载本地数据
Core.task().call(new Callable<D>() {
@Override
public D call() throws Exception {
return loadMoreLocalData(mNextPageIndex, getLocalPageSize());
}
}).enqueue(new Callback<D>() {
@Override
public void onSuccess(final D result) {
RecyclerView recyclerView = getRecyclerView();
if (recyclerView != null) {
//Java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling
//at android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll
recyclerView.post(new Runnable() {
@Override
public void run() {
onResponse(false, false, result);
}
});
}
}
});
}
}