关于recycleview的基础使用就不说了,记录一下我在使用recycleview中的一些体会。
1.关于recycleview的下拉刷新和底部加载(或者上拉加载)
下拉刷新,
recycleview的下拉刷新我们可以使用官方提供的swiperefreshlayout来实现,恩,很easy。在recycleview外面套一个swiperefreshlayout就OK了。方便快捷。
第二:底部加载
recycleview的底部加载也不是太复杂,可以说在listview的时候我们就用的一种方法,不同的viewtype,然后把最后一个itemview单独设置一种type,也就是你想实现的底部加载的view的样子,然后到滚动到底部的时候显示这个view就好了。
当然说起来很简单,但是具体怎么实现呢,
下面上两张我自己实现的图给大家看下:
效果是有了,下面说说遇到的问题:
1.插入新的数据
原来我们用listview的时候,插入数据了以后直接通过adapter的notifydatasetchanged就OK了。然后recycleview比listview更好的地方,就是它更灵活,控制性更强,我们想怎么摆弄就怎么摆弄。
所以关于notify,recycleview的adapter提供了更多的方法:
看下面的注释我们就知道大概每个方法是干嘛的了。
我们就拿notifyItemRangeInserted(int positionStart,int itemCount)来说,我把它的注释截完整了给大家看下:
我理解的意思是 这个方法作用是告诉observer从positionStart位置开始的itemCount个数的item是新加来的。
当然我要说,注释信息并不是太准确啊,啊,啊,啊。
测试代码:
activity里面的代码:
List<String> addedItems = new ArrayList<String>();
addedItems.add("1111");
addedItems.add("2222");
addedItems.add("3333");
mAdapter.addItems(addedItems,0);
adapter里面的代码:
public void addItems(List<String> addStrs,int position)
{
mContentList.addAll(position, addStrs);
notifyItemRangeInserted(position, addStrs.size());
}
当然我写了每个item的click事件的接口以及回调:
class OnContentItemClickListenerImpl implements RecyclerViewAdapter.OnContentItemClickListener{
@Override
public void OnContentItemClick(int position) {
Toast.makeText(RecyclerViewActivity.this,"position"+position,Toast.LENGTH_SHORT).show();
}
}
出来的结果是:position:0。刷新了以后再点击刚刚点过的那一项,出来的结果还是:position:0。
这说明插入了数据以后,在插的item的原来位置的item的position并没有发生变化。
那这个怎么解决?
看解决办法:
public void addItems(List<String> addStrs,int position)
{
mContentList.addAll(position, addStrs);
notifyItemRangeInserted(position, addStrs.size());
notifyItemRangeChanged(position + addStrs.size(), getItemCount()-addStrs.size());
}
新加了一行,这行的目的就是告诉adapter,原来的那些item它们的position发生了变化.
这样再点击每个item。位置正确了。
2.从头部插入新数据的时候并没有itemAnimation动画的发生。
当然这个问题,你们也可以先测试一下,就知道了,
如果notifiItemRangeInserted或者notifyItemInserted的第一个参数值是0 的话,也就是说新插入的数据在最上面
则新数据插进入的时候,可能你都没有感觉到,你向下滚动的时候,可能才看到,原来数据已经插入进来了。
我以为给recycleview加了 mRecyclerView.setItemAnimator(newDefaultItemAnimator());
这句以后,不论新的item插在哪儿都会有动画的,结果0位置的时候没有。不能说没有,是没有看到。那是怎么做的呢??我在刷新数据的时候,也就是addItems方法被调用之后,调用了这句
mRecyclerView.scrollToPosition(0);
那这样就可以很明显的看到顶部插入动画了。
默认动画太单调
这里给大家推荐一个开关的itemanimator的library.
https://github.com/gabrielemariotti/RecyclerViewItemAnimators
具体就不多说了。
祝大家用recycleview用的愉快!加油!
补充:
关于在recycleview的第0个位置添加item有新发现,这个份两种情况:
1.当recycleview中的item没有占满整个屏幕的时候,我们还是可以清晰的看到item的插入动画的。
2.当recycleview的item已经占满整个屏幕的时候,这个时候再在第0个位置插入数据,就看不到插入动画了。需要使用上面介绍的方法:recycleView.scrollToPosition(0)。