Recyclerview_helper多功能封装,让你的应用更加自如

前言

RecyclerView作为列表使用,在项目中的应用场景实在是太普遍了。针对项目应用,主要使用了RecyclerView的单或多类型Item,点击/长按事件,ItemAnimator动画效果以及上拉加载、下拉刷新。recyclerview_helper就是针对以上应用场景进行的封装与使用,避免在项目使用中重复的敲代码以及依赖多个库或者自定义实现等复杂方式。

介绍

 

如上所示,recyclerview_helper针对不同应用场景封装了不同的功能。

具体功能如下:

1.封装了ViewHolder以及Adapter,避免每次都要重复写创建ViewHolder以及重写onCreateViewHolder,onBindViewHolder方法,支持单/多类型Item。

2.封装了OnItemClickListener以及OnItemLongClickListener,不必每次写接口,定义回调。仅支持对Item的点击事件。

3.具有各种炫酷的动画效果,功能装饰者模式封装Adapter添加初始化动画效果 ,以及自定义ItemAnimator实现各种炫酷的Item增删动画效果。

4.支持添加头尾布局,以及支持下拉刷新和上拉加载更多功能。同时支持自定义下拉刷新布局及动画,以及上拉加载更多的布局,可实现各种炫酷效果,跟随你的想象放飞。

使用

1.添加依赖

①.在项目的 build.gradle 文件中添加

 
 
 
 
  1. allprojects { 
  2.         repositories { 
  3.             ... 
  4.             maven { url 'https://jitpack.io' } 
  5.         } 
  6.     }  

②.在 module 的 build.gradle 文件中添加依赖

 
 
 
 
  1. dependencies { 
  2.  
  3.     compile 'com.github.LRH1993:recyclerview_helper:V1.0.3' 
  4.  
  5.  

2.单/多类型Item使用

 

 

单类型

 
 
 
 
  1. CommonAdapter<String> mAdapter = new CommonAdapter<String>(this, R.layout.item_common, mDatas) {             
  2.                  @Override 
  3.             public void convert(BaseViewHolder holder, int position) { 
  4.                 holder.setText(R.id.tv_content,mDatas.get(position));                 
  5.                         int number = new Random().nextInt(3); 
  6.                 holder.setImageResource(R.id.iv_content,mImageRes[number]); 
  7.             } 
  8.         }; 
  9.         mRecyclerView.setAdapter(mAdapter);  

通过实现CommonAdapter,传入context,布局以及数据,然后实现convert方法,设置view的显示数据就完成了。很简洁方便。

多类型

 
 
 
 
  1. MultiItemTypeSupport<String> support = new MultiItemTypeSupport<String>() {             
  2.                  @Override 
  3.             public int getLayoutId(int itemType) {                 
  4.                  if (itemType == TYPE_HEAD) {                     
  5.                      return R.layout.item_special; 
  6.                 } else {                     
  7.                      return R.layout.item_common; 
  8.                 } 
  9.  
  10.             }             
  11.             @Override 
  12.             public int getItemViewType(int position, String s) {                 
  13.                  if (position%3==0&& position>0) {                     
  14.                      return TYPE_HEAD; 
  15.                 } else {                     
  16.                    return TYPE_COMMON; 
  17.                 } 
  18.             } 
  19.         }; 
  20. ----------------------------------------------------------------------------------------------------------------------------- 
  21.  MultiItemCommonAdapter<String> mAdapter = new MultiItemCommonAdapter<String>(this, mDatas, support) {             
  22.             @Override 
  23.             public void convert(BaseViewHolder holder, int position) {                 
  24.                                  if (position%3==0&& position>0) { 
  25.                     holder.setImageResource(R.id.iv_head,R.drawable.multi_image); 
  26.                 } else { 
  27.                     holder.setText(R.id.tv_content,mDatas.get(position));                     
  28.                                  int number = new Random().nextInt(3)+3; 
  29.                     holder.setImageResource(R.id.iv_content,mImageRes[number]); 
  30.                 } 
  31.             } 
  32.         }; 
  33.         mRecyclerView.setAdapter(mAdapter);  

和单类型的区别就是需要实现MultiItemTypeSupport,在MultiItemCommonAdapter对象中传入实现的该对象,该对象完成两个方法,功能是通过类型判别Item布局以及通过位置和数据判断返回类型。通过这个对象,避免我们在Adapter中进行类别判断的书写。

该部分实现参考了鸿洋大神对RecyclerView的封装。

3.事件监听使用

 

事件监听的使用就比较简单了,和正常使用一样。

 
 
 
 
  1. adapter.setOnItemClickListener(new CommonAdapter.OnItemClickListener() {             
  2.                 @Override 
  3.             public void onItemClick(View view, RecyclerView.ViewHolder holder, int position) { 
  4.                 System.out.println("点击"); 
  5.                 showMyDialog("响应点击事件"); 
  6.             } 
  7.         }); 
  8.         adapter.setOnItemLongClickListener(new CommonAdapter.OnItemLongClickListener() {             
  9.                  @Override 
  10.             public boolean onItemLongClick(View view, RecyclerView.ViewHolder holder, int position) { 
  11.                 showMyDialog("响应长按事件");                 
  12.                         return false
  13.             } 
  14.         });  

4.动画使用

 

 

gif录制效果不太明显,实际手机上看着效果还是不错的。

 
 
 
 
  1. mRecyclerView.setItemAnimator(new LandingAnimator()); 
  2.         ScaleInAnimationAdapter scaleAdapter = new ScaleInAnimationAdapter(adapter); 
  3.         scaleAdapter.setFirstOnly(false); 
  4.         scaleAdapter.setDuration(500); 
  5.         mRecyclerView.setAdapter(scaleAdapter);  

动画效果分两种:

第一种:adapter初始化item的动画效果

第二种:ItemAnimator定义的动画效果

第一种动画效果使用了装饰者模式,需要再封装一层,然后通过setAdapter添加进去。

第二种直接和平时使用一样。

除此之外,ItemAnimator还有以下高级功能:

设置动画时长

 
 
 
 
  1. mRecyclerView.getItemAnimator().setAddDuration(1000); 
  2. mRecyclerView.getItemAnimator().setRemoveDuration(1000); 
  3. mRecyclerView.getItemAnimator().setMoveDuration(1000); 
  4. mRecyclerView.getItemAnimator().setChangeDuration(1000);  

插值器

 
 
 
 
  1. SlideInLeftAnimator animator = new SlideInLeftAnimator(); 
  2.  
  3. animator.setInterpolator(new OvershootInterpolator()); 
  4.  
  5. mRecyclerView.setItemAnimator(animator);  

也可以通过自定义AnimateViewHolder实现类,实现其他动画效果。

Adapter也有一些高级功能:

动画时长

 
 
 
 
  1. AlphaInAnimationAdapter alphaAdapter = new AlphaInAnimationAdapter(adapter); 
  2. alphaAdapter.setDuration(1000); 
  3. mRecyclerView.setAdapter(alphaAdapter);  

插值器

  1. AlphaInAnimationAdapter alphaAdapter = new AlphaInAnimationAd
THE END