关于recycleview的基础使用就不说了,记录一下我在使用recycleview中的一些体会。

1.关于recycleview的下拉刷新和底部加载(或者上拉加载)

下拉刷新,

recycleview的下拉刷新我们可以使用官方提供的swiperefreshlayout来实现,恩,很easy。在recycleview外面套一个swiperefreshlayout就OK了。方便快捷。

   第二:底部加载

         recycleview的底部加载也不是太复杂,可以说在listview的时候我们就用的一种方法,不同的viewtype,然后把最后一个itemview单独设置一种type,也就是你想实现的底部加载的view的样子,然后到滚动到底部的时候显示这个view就好了。

当然说起来很简单,但是具体怎么实现呢,

下面上两张我自己实现的图给大家看下:

关于Recycleview使用的一些心得_数据

关于Recycleview使用的一些心得_RecyclerView_02

效果是有了,下面说说遇到的问题:

1.插入新的数据

原来我们用listview的时候,插入数据了以后直接通过adapter的notifydatasetchanged就OK了。然后recycleview比listview更好的地方,就是它更灵活,控制性更强,我们想怎么摆弄就怎么摆弄。

所以关于notify,recycleview的adapter提供了更多的方法:


看下面的注释我们就知道大概每个方法是干嘛的了。

我们就拿notifyItemRangeInserted(int positionStart,int itemCount)来说,我把它的注释截完整了给大家看下:


关于Recycleview使用的一些心得_RecyclerView_03

我理解的意思是 这个方法作用是告诉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)。