Recyclerview刷新延迟的问题

总结一下最近项目上遇到的一个问题

前段时间在项目上使用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 list = (List) data;
        if (list != null) {
            mBookAdapter.addAll(list);
            mBookAdapter.notifyDataSetChanged();
        }
    }
}

我们一般性的都习惯在recyclerview设置了adapter之后,等数据拉取下来了之后再add进去,但是我在项目中发现,这样的做法会导致recyclerview数据刷新延迟,background先出来,然后item数据才出来

平时我们没发现是因为没有给item设置background,没有对比,看不出来。

一开始我以为是我代码哪里设置了什么东西导致的,但检查都没发现什么异常,我甚至监听item获得焦点之后才控制background出现,但仍然无济于事。后来在这篇博客上找到了原因:http://blog.csdn.net/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 list = (List) data;
        if (list != null) {
            mBookAdapter.addAll(list);
            //在这里给recyclerview设置adapter
            mRecyclerview.setAdapter(mBookAdapter);
            mBookAdapter.notifyDataSetChanged();
        }
    }
}

本着共享的精神,希望这篇博客对遇到问题的大家会有所帮助,有所启发。

你可能感兴趣的:(Recyclerview刷新延迟的问题)