总结一下最近项目上遇到的一个问题
前段时间在项目上使用recyclerview来加载数据并且在item获得焦点时添加一个background,数据需要耗时拉取的,代码如下:
public void initData() {
mRecyclerview.setLayoutManager(new LinearLayoutManager(this));
mBookAdapter = new BookAdapter();
mRecyclerview.setAdapter(mBookAdapter);
mRecyclerview.addItemDecoration(new SpaceItemDecoration(50));
}
@Override
protected void onStart() {
super.onStart();
getLoaderManager().destroyLoader(ID_BOOK_LOADER);
getLoaderManager().initLoader(ID_BOOK_LOADER, null, this);
}
@Override
public Loader onCreateLoader(int id, Bundle bundle) {
if (id == ID_BOOK_LOADER) {
return new BookLoader(this);
}
return null;
}
@Override
public void onLoadFinished(Loader loader, Object data) {
int id = loader.getId();
if (id == ID_BOOK_LOADER) {
List<String> list = (List<String>) data;
if (list != null) {
mBookAdapter.addAll(list);
mBookAdapter.notifyDataSetChanged();
}
}
}
我们一般性的都习惯在recyclerview设置了adapter之后,等数据拉取下来了之后再add进去,但是我在项目中发现,这样的做法会导致recyclerview数据刷新延迟,background先出来,然后item数据才出来
平时我们没发现是因为没有给item设置background,没有对比,看不出来。
一开始我以为是我代码哪里设置了什么东西导致的,但检查都没发现什么异常,我甚至监听item获得焦点之后才控制background出现,但仍然无济于事。后来在这篇博客上找到了原因:http://blog.youkuaiyun.com/cumtsx/article/details/51834797
解决的办法就是在adapter.add了数据之后再给recyclerview设置adapter,这样就不会出现recyclerview刷新延迟问题了,修改后的代码如下:
public void initData() {
mRecyclerview.setLayoutManager(new LinearLayoutManager(this));
mBookAdapter = new BookAdapter();
//mRecyclerview.setAdapter(mBookAdapter);
mRecyclerview.addItemDecoration(new SpaceItemDecoration(50));
}
@Override
protected void onStart() {
super.onStart();
getLoaderManager().destroyLoader(ID_BOOK_LOADER);
getLoaderManager().initLoader(ID_BOOK_LOADER, null, this);
}
@Override
public Loader onCreateLoader(int id, Bundle bundle) {
if (id == ID_BOOK_LOADER) {
return new BookLoader(this);
}
return null;
}
@Override
public void onLoadFinished(Loader loader, Object data) {
int id = loader.getId();
if (id == ID_BOOK_LOADER) {
List<String> list = (List<String>) data;
if (list != null) {
mBookAdapter.addAll(list);
//在这里给recyclerview设置adapter
mRecyclerview.setAdapter(mBookAdapter);
mBookAdapter.notifyDataSetChanged();
}
}
}
本着共享的精神,希望这篇博客对遇到问题的大家会有所帮助,有所启发。