关于Recycleview使用的一些心得

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

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

   第一:下拉刷新

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

   第二:底部加载

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

当然说起来很简单,但是具体怎么实现呢,大家可以参照:http://blog.csdn.net/fangchao3652/article/details/43983317 这个写的基本可以实现。

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

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

1.插入新的数据

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

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

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

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


我理解的意思是 这个方法作用是告诉observer从positionStart位置开始的itemCount个数的item是新加来的。

然后之前在这些位置的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);

   那这样就可以很明显的看到顶部插入动画了。

3.默认动画太单调

   这里给大家推荐一个开关的itemanimator的library.

https://github.com/gabrielemariotti/RecyclerViewItemAnimators

具体就不多说了。

祝大家用recycleview用的愉快!加油!

补充:

关于在recycleview的第0个位置添加item有新发现,这个份两种情况:

1.当recycleview中的item没有占满整个屏幕的时候,我们还是可以清晰的看到item的插入动画的。

2.当recycleview的item已经占满整个屏幕的时候,这个时候再在第0个位置插入数据,就看不到插入动画了。需要使用上面介绍的方法:recycleView.scrollToPosition(0)。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值