RecyclerviewView

[Gankly] RecyclerView 闪屏问题

2017-03-24  本文已影响46人  leftcoding

Gankly

基于干货Api、妹子图做的一个应用。应用包含干货 androi 、ios 、妹子,其他还有几个模块,包括新鲜事(煎蛋)、科技资讯、团队博客,以及抓包获取百思不得姐接口,做了视频跟给图片这2个模块。有兴趣的朋友,可以访问这个开源项目,如果有什么问题,可以留言,也可以联系我。

项目地址: https://github.com/leftcoding/GankLy

写这个文章的目的,因为在做这个项目中,总会碰到一些问题。所以,我觉得有必要把自己碰到的问题,解决问题的方法,写在以后的文章中,让其他碰到同样问题的人,少走一些冤枉路。

RecyclerView

这里不做描述了,相信百度一堆,可以直接百度下。这里说下碰到的问题。
如图:


做下拉刷新的时候,删除数据,然后再重新添加数据,就会导致这个屏幕闪屏一下。代码如下

Adapter
// 第一次添加数据
public void refillItems(List<ResultsBean> results) {
        int size = mResults.size();
        mResults.clear();
        notifyItemRangeRemoved(0, size);
        appendItems(results);
    }
// 之后添加数据
public void appendItems(List<ResultsBean> results) {
        mResults.addAll(results);
        int size = mResults.size();
        notifyItemRangeInserted(size, results.size());
    }

后来经过百度,得知应用是recyclerview的动画效果,但是我没有添加默认动画,所以问题点,就不是这个了。

其实是recylerview没有给每个item设置一个明确的id,这会导致不断刷新情况下同样序号返回的子控件是不一样的,这就会造成不知道把焦点给那个控件。但是如果用了 notifyInsert 不会出现这样的问题。如果用了 notifyInsert 那么 notifyItemRangeInserted 的作用就发挥不出来。

Google 结果,在Adapter 初始化的时候,加上

 public AndroidAdapter(Context context, int type) {
        setHasStableIds(true);
        mResults = new ArrayList<>();
        mContext = context;
        mLayout = type;
  }
too young,to native #####

结果虽然不闪屏了,但是某些Item会有重复的。

原来还要再复写Adater的一个方法,返回唯一的id

@Override
public long getItemId(int position) {
      return position;
}

这样就完美解决问题。!

第一次写文章,比较生疏,之后还会把碰到的问题整合下,以文章的形式呈现给大家。

上一篇下一篇

猜你喜欢

热点阅读