BaseRecyclerViewAdapterHelper的使用


BaseRecyclerViewAdapterHelper是一个强大且灵活的RecyclerViewAdapter,那么它都能做什么呢?
  • 可以大量减少Adapter中的代码(对于多类型数据,需要写ViewHolder,只需要写多个bean类即可);
  • 可以定义一个多类型的 MultiesAdapter替代多个adapter使用;
  • 可以很轻松的添加RecyclerView加载动画;
  • 添加头部、添加尾部;
  • 支持下拉刷新、上拉加载更多(作为条目填充);
  • 支持分组(Section,可以看成是多类型条目的一种,有两种类型);
  • 支持自定义item类型;
  • 支持setEmptyView;
  • 可以添加item点击事件;
  • 支持子布局多个控件的点击事件;
好的,接下来我们直接来谈其配置和使用:

在 build.gradle 的 repositories 添加:

allprojects {
    repositories {
        maven { url "https://jitpack.io" }
    }
}

然后增加dependencies

dependencies {
    compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:v1.9.7'
}
这里需要说明一下,依赖的BaseRecyclerViewAdapterHelper不同,会导致方法使用上是有差别的,下边提供其他依赖:
'compile
'com.github.CymChad:BaseRecyclerViewAdapterHelper:v1.5.8'

'compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:v1.5'

1,单类型BaseQuickAdapter使用
  1. public class MyQuickAdapter extends BaseQuickAdapter<MultyItemBean> implements View.OnClickListener,View.OnLongClickListener{  
  2.     public MyQuickAdapter(int layoutResId, List<MultyItemBean> data) {  
  3.         super(layoutResId, data);  
  4.     }  
  5.     public MyQuickAdapter(List<MultyItemBean> data) {  
  6.         super(data);  
  7.     }  
  8.     public MyQuickAdapter(View contentView, List<MultyItemBean> data) {  
  9.         super(contentView, data);  
  10.     }  
  11.     @Override  
  12.     protected void convert(BaseViewHolder baseViewHolder,  MultyItemBean multyItemBean) {  
  13.         baseViewHolder.setText(R.id.content_tv, multyItemBean.content)  
  14.                 .setChecked(R.id.checkbox_content,multyItemBean.checked)  
  15.                 .setOnClickListener(R.id.content_tv,this)  
  16.                 //设置item中某个控件的长点击事件监听,而.setOnItemClickListener()是设置整个条目的点击监听的  
  17.                 .setOnLongClickListener(R.id.content_tv,this);  
  18. //        this.setOnRecyclerViewItemClickListener();  
  19. //        this.setOnRecyclerViewItemChildClickListener(listener);  
  20. //        this.setOnRecyclerViewItemLongClickListener(listener2);  
  21.     }  
  22.     @Override  
  23.     public void onClick(View view) {  
  24.         if (view.getId() == R.id.content_tv) {  
  25.             Toast.makeText(Myapp.context, "Item中某个控件被点击了", Toast.LENGTH_SHORT).show();  
  26.         }  
  27.     }  
  28.     @Override  
  29.     public boolean onLongClick(View view) {  
  30.         if (view.getId() == R.id.content_tv) {  
  31.             Toast.makeText(Myapp.context, "Item中某个控件被长按了", Toast.LENGTH_SHORT).show();  
  32.         }  
  33.         return true;  
  34.     }  
  35. }  
public class MyQuickAdapter extends BaseQuickAdapter<MultyItemBean> implements View.OnClickListener,View.OnLongClickListener{
    public MyQuickAdapter(int layoutResId, List<MultyItemBean> data) {
        super(layoutResId, data);
    }
    public MyQuickAdapter(List<MultyItemBean> data) {
        super(data);
    }
    public MyQuickAdapter(View contentView, List<MultyItemBean> data) {
        super(contentView, data);
    }
    @Override
    protected void convert(BaseViewHolder baseViewHolder,  MultyItemBean multyItemBean) {
        baseViewHolder.setText(R.id.content_tv, multyItemBean.content)
                .setChecked(R.id.checkbox_content,multyItemBean.checked)
                .setOnClickListener(R.id.content_tv,this)
                //设置item中某个控件的长点击事件监听,而.setOnItemClickListener()是设置整个条目的点击监听的
                .setOnLongClickListener(R.id.content_tv,this);
//        this.setOnRecyclerViewItemClickListener();
//        this.setOnRecyclerViewItemChildClickListener(listener);
//        this.setOnRecyclerViewItemLongClickListener(listener2);
    }
    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.content_tv) {
            Toast.makeText(Myapp.context, "Item中某个控件被点击了", Toast.LENGTH_SHORT).show();
        }
    }
    @Override
    public boolean onLongClick(View view) {
        if (view.getId() == R.id.content_tv) {
            Toast.makeText(Myapp.context, "Item中某个控件被长按了", Toast.LENGTH_SHORT).show();
        }
        return true;
    }
}

Activity中代码:
  1. quickAdapter = new MyQuickAdapter(R.layout.adapter_content, data);//单类型的item布局是放在构造中的,而多类型用的是方法  
quickAdapter = new MyQuickAdapter(R.layout.adapter_content, data);//单类型的item布局是放在构造中的,而多类型用的是方法

动画添加, 有3种方式:
  1. //        multyItemAdapter.openLoadAnimation();  //默认为渐显效果  
  2.         dragAndSwipAdater.isFirstOnly(false); //设置不仅是首次填充数据时有动画,以后上下滑动也会有动画  
  3.         //有5种动画可以设置,但若是多类型数据时,可能只有第一种类型(第0ViewType)数据有动画效果,也许被看成了单类型了  
  4.         dragAndSwipAdater.openLoadAnimation(BaseMultiItemQuickAdapter.SLIDEIN_LEFT);  
  5. //        multyItemAdapter.openLoadAnimation(new BaseAnimation() { //自定义动画  
  6. //            @Override  
  7. //            public Animator[] getAnimators(View view) {  
  8. //                return new Animator[]{  
  9. //                    ObjectAnimator.ofFloat(view, "scaleY", 0.3f, 5f, 1),  
  10. //                    ObjectAnimator.ofFloat(view, "scaleX", 0.3f, 8f, 1),  
  11. //                    ObjectAnimator.ofFloat(view, "rotation", 1, 60, 0)  
  12. //                };  
  13. //            }   
//        multyItemAdapter.openLoadAnimation();  //默认为渐显效果
        dragAndSwipAdater.isFirstOnly(false); //设置不仅是首次填充数据时有动画,以后上下滑动也会有动画
        //有5种动画可以设置,但若是多类型数据时,可能只有第一种类型(第0ViewType)数据有动画效果,也许被看成了单类型了
        dragAndSwipAdater.openLoadAnimation(BaseMultiItemQuickAdapter.SLIDEIN_LEFT);
//        multyItemAdapter.openLoadAnimation(new BaseAnimation() { //自定义动画
//            @Override
//            public Animator[] getAnimators(View view) {
//                return new Animator[]{
//                    ObjectAnimator.ofFloat(view, "scaleY", 0.3f, 5f, 1),
//                    ObjectAnimator.ofFloat(view, "scaleX", 0.3f, 8f, 1),
//                    ObjectAnimator.ofFloat(view, "rotation", 1, 60, 0)
//                };
//            } 


系统默认的5种动画如下:
  1.  public static final int ALPHAIN = 1;    
  2.  public static final int SCALEIN = 2;    
  3.  public static final int SLIDEIN_BOTTOM = 3;    
  4.  public static final int SLIDEIN_LEFT = 4;    
  5.  public static final int SLIDEIN_RIGHT = 5;   
 public static final int ALPHAIN = 1;  
 public static final int SCALEIN = 2;  
 public static final int SLIDEIN_BOTTOM = 3;  
 public static final int SLIDEIN_LEFT = 4;  
 public static final int SLIDEIN_RIGHT = 5; 

添加header,footer:

mQuickAdapter.addHeaderView(getView());
mQuickAdapter.addFooterView(getView());

加载更多设置:

mQuickAdapter.setOnLoadMoreListener(PAGE_SIZE, new BaseQuickAdapter.RequestLoadMoreListener() {
            @Override
            public void onLoadMoreRequested() {
                if (mCurrentCounter >= TOTAL_COUNTER) {
                    mRecyclerView.post(new Runnable() {
                        @Override
                        public void run() {
                            mQuickAdapter.isNextLoad(false);
                        }
                    });
                } else {
                    // reqData
                    mCurrentCounter = mQuickAdapter.getItemCount();
                    mQuickAdapter.isNextLoad(true);
                }
            }
        });
2,多类型BaseMultiItemQuickAdapter的用法:
  1. /** 
  2.  * 这种Adapter类可以直接在Activity中用匿名内部类方式实现,这样就不用创建不同的adapter了, 
  3.  * 以后可以只用这一个MyMultitypeItemAdapter给多个界面的RecyclerView,只要设置addItemType() 
  4.  * 和不同的bean即可,无需设置holder 
  5.  */  
  6. public class MyMultitypeItemAdapter extends BaseMultiItemQuickAdapter<MultyItemBean> implements View.OnClickListener,View.OnLongClickListener{  
  7.     public MyMultitypeItemAdapter(List<MultyItemBean> data) {  
  8.         super(data);  
  9.         addItemType(0, R.layout.adapter_title);  //必须设置Item类型,否则空职指针异常  
  10.         addItemType(1,R.layout.adapter_content);  
  11.     }  
  12.     @Override  
  13.     protected void convert(BaseViewHolder baseViewHolder, MultyItemBean multyItemBean) {  
  14.         switch (multyItemBean.getItemType()) {  //或采用baseViewHolder.getItemViewType()方式  
  15.             case 0//标题:  
  16.                 baseViewHolder.setText(R.id.tv_title, multyItemBean.content);  
  17.                 break;  
  18.             case 1//内容  
  19.                 baseViewHolder.setChecked(R.id.checkbox_content, multyItemBean.checked);  
  20.                 baseViewHolder.setText(R.id.content_tv, multyItemBean.content)  
  21.                         .setChecked(R.id.checkbox_content,multyItemBean.checked)  
  22.                         .setOnClickListener(R.id.content_tv,this)  
  23.                         //设置item中某个控件的长点击事件监听,而.setOnItemClickListener()是设置整个条目的点击监听的  
  24.                         .setOnLongClickListener(R.id.content_tv,this);  
  25.                 break;  
  26.         }  
  27.     }  
/**
 * 这种Adapter类可以直接在Activity中用匿名内部类方式实现,这样就不用创建不同的adapter了,
 * 以后可以只用这一个MyMultitypeItemAdapter给多个界面的RecyclerView,只要设置addItemType()
 * 和不同的bean即可,无需设置holder
 */
public class MyMultitypeItemAdapter extends BaseMultiItemQuickAdapter<MultyItemBean> implements View.OnClickListener,View.OnLongClickListener{
    public MyMultitypeItemAdapter(List<MultyItemBean> data) {
        super(data);
        addItemType(0, R.layout.adapter_title);  //必须设置Item类型,否则空职指针异常
        addItemType(1,R.layout.adapter_content);
    }
    @Override
    protected void convert(BaseViewHolder baseViewHolder, MultyItemBean multyItemBean) {
        switch (multyItemBean.getItemType()) {  //或采用baseViewHolder.getItemViewType()方式
            case 0: //标题:
                baseViewHolder.setText(R.id.tv_title, multyItemBean.content);
                break;
            case 1: //内容
                baseViewHolder.setChecked(R.id.checkbox_content, multyItemBean.checked);
                baseViewHolder.setText(R.id.content_tv, multyItemBean.content)
                        .setChecked(R.id.checkbox_content,multyItemBean.checked)
                        .setOnClickListener(R.id.content_tv,this)
                        //设置item中某个控件的长点击事件监听,而.setOnItemClickListener()是设置整个条目的点击监听的
                        .setOnLongClickListener(R.id.content_tv,this);
                break;
        }
    }

3,分组BaseSectionQuickAdapter:
  1. public class MySectionAdapter extends BaseSectionQuickAdapter<Section_titileBean> {  
  2.   
  3.     public MySectionAdapter(int layoutResId, int sectionHeadResId, List<Section_titileBean> data) {  
  4.         super(layoutResId, sectionHeadResId, data);  
  5.     }  
  6.     @Override  
  7.     protected void convertHead(BaseViewHolder helper, Section_titileBean bean) {  
  8.         //下边的两种方式效果相同,bean.isHeader==false时,TextView不会被赋值  
  9.         helper.setText(R.id.section_header, bean.header);  
  10. //        if (bean.isHeader) {  
  11. //            helper.setText(R.id.section_header, bean.header);  
  12. //        }else {  
  13. //            helper.setText(R.id.section_header, bean.header);  
  14. //        }  
  15.     }  
  16.     @Override  
  17.     protected void convert(BaseViewHolder helper, Section_titileBean bean) {  
  18.         helper.setText(R.id.section_content, bean.t);  
  19.     }  
  20. }  
public class MySectionAdapter extends BaseSectionQuickAdapter<Section_titileBean> {

    public MySectionAdapter(int layoutResId, int sectionHeadResId, List<Section_titileBean> data) {
        super(layoutResId, sectionHeadResId, data);
    }
    @Override
    protected void convertHead(BaseViewHolder helper, Section_titileBean bean) {
        //下边的两种方式效果相同,bean.isHeader==false时,TextView不会被赋值
        helper.setText(R.id.section_header, bean.header);
//        if (bean.isHeader) {
//            helper.setText(R.id.section_header, bean.header);
//        }else {
//            helper.setText(R.id.section_header, bean.header);
//        }
    }
    @Override
    protected void convert(BaseViewHolder helper, Section_titileBean bean) {
        helper.setText(R.id.section_content, bean.t);
    }
}
注意:在使用的时候,bean数据类必须继承 MultiItemEntity或SectionEntity

使用setEmptyView:

mQuickAdapter.setEmptyView(getView());

添加子布局多个控件的点击事件:

    Adapter

protected void convert(BaseViewHolder helper, Status item) {
    helper.setOnClickListener(R.id.tweetAvatar, new OnItemChildClickListener())
      .setOnClickListener(R.id.tweetName, new OnItemChildClickListener());
}

Activity

mQuickAdapter.setOnRecyclerViewItemChildClickListener(new BaseQuickAdapter.OnRecyclerViewItemChildClickListener() {
            @Override
            public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
                String content = null;
                Status status = (Status) adapter.getItem(position);
                switch (view.getId()) {
                    case R.id.tweetAvatar:
                        content = "img:" + status.getUserAvatar();
                        break;
                    case R.id.tweetName:
                        content = "name:" + status.getUserName();
                        break;
                }
                Toast.makeText(AnimationUseActivity.this, content, Toast.LENGTH_LONG).show();
            }
        });
4,实现拖拽BaseItemDraggableAdapter:
  1. /** 
  2.  * 暂时该侧滑删除功能的adapter只测试了单类型的数据填充,但可用于多种LayoutManager情况 
  3.  */  
  4. public class DragAndSwipAdater extends BaseItemDraggableAdapter<MultyItemBean> {  
  5.   
  6.     public DragAndSwipAdater(View contentView, List<MultyItemBean> data) {  
  7.         super(contentView, data);  
  8.     }  
  9.     public DragAndSwipAdater(List<MultyItemBean> data) {  
  10.         super(R.layout.adapter_title,data);  
  11.     }  
  12.     public DragAndSwipAdater(int layoutResId, List<MultyItemBean> data) {  
  13.         super(layoutResId, data);  
  14.     }  
  15.     @Override  
  16.     protected void convert(BaseViewHolder baseViewHolder, MultyItemBean multyItemBean) {  
  17.         baseViewHolder.setText(R.id.tv_title,"DragAndSwipItem: " + multyItemBean.content);  
  18.     }  
  19. }  
/**
 * 暂时该侧滑删除功能的adapter只测试了单类型的数据填充,但可用于多种LayoutManager情况
 */
public class DragAndSwipAdater extends BaseItemDraggableAdapter<MultyItemBean> {

    public DragAndSwipAdater(View contentView, List<MultyItemBean> data) {
        super(contentView, data);
    }
    public DragAndSwipAdater(List<MultyItemBean> data) {
        super(R.layout.adapter_title,data);
    }
    public DragAndSwipAdater(int layoutResId, List<MultyItemBean> data) {
        super(layoutResId, data);
    }
    @Override
    protected void convert(BaseViewHolder baseViewHolder, MultyItemBean multyItemBean) {
        baseViewHolder.setText(R.id.tv_title,"DragAndSwipItem: " + multyItemBean.content);
    }
}

Activity的全部代码:
  1. public class RecyclerViewActivity extends BaseActivity implements Toolbar.OnMenuItemClickListener,BaseQuickAdapter.RequestLoadMoreListener{  
  2.     @Bind(R.id.recyclerview)  
  3.     RecyclerView recyclerview;  
  4.     @Bind(R.id.swipe_recycle_lt)  
  5.     SwipeRefreshLayout swipeRecycleLt;  
  6.     private RecycleBean bean;  
  7.     private List<Integer> contentListT;  
  8.     private String[] titles;  
  9.     private ArrayList<Boolean> contentListCBox;  
  10.     private ReAdapter reAdapter;  
  11.     private MyQuickAdapter quickAdapter;  
  12.     private ArrayList<MultyItemBean> data;  
  13.     private List<Section_titileBean> sectionData;  
  14.     private MyMultitypeItemAdapter multyItemAdapter;  
  15.     private OnItemDragListener onItemDragListener;  
  16.     private OnItemSwipeListener onItemSwipeListener;  
  17.     private DragAndSwipAdater dragAndSwipAdater;  
  18.     private int mError = 0;  
  19.     private int mNoData = 1;  
  20.     private int dataStatu = 1;  
  21.     private MySectionAdapter sectionAdapter;  
  22.   
  23.     @Override  
  24.     protected void initView() {  
  25.         //Toobar的使用需要先fvb到Toobar布局,然后在MenuInflate到menu布局,同时给toobar设置点击监听  
  26.         Toolbar toolBar = (Toolbar) findViewById(R.id.toolbar);  
  27.         setSupportActionBar(toolBar);  
  28.         toolBar.setTitle("ToolBarTitle");//设置标题  
  29.         toolBar.setNavigationIcon(R.mipmap.ic_launcher);//设置图标  
  30.         toolBar.setOnMenuItemClickListener(this);//设置Menu Item点击  
  31.     }  
  32.   
  33.     @Override  
  34.     protected void initData() {  
  35.         //设置SwipeRefreshLayout刷新样式,颜色可以设置5种以上  
  36.         swipeRecycleLt.setColorSchemeColors(Color.RED, Color.BLUE, Color.GREEN,Color.BLACK,Color.YELLOW);  
  37.         //数据准备  
  38.         bean = new RecycleBean();  
  39.         data = new ArrayList<MultyItemBean>();  
  40.         sectionData = new ArrayList<>();  
  41.         contentListT = new ArrayList<Integer>();  
  42.         contentListCBox = new ArrayList<Boolean>();  
  43.         titles = new String[60];  
  44.         for (int i = 0; i < 30; i++) {  
  45.             contentListT.add(i);  
  46.             data.add(new MultyItemBean(true, String.valueOf(i),1));  
  47.             sectionData.add(new Section_titileBean(true,"header "+i));  
  48.             sectionData.add(new Section_titileBean(false,"is not header "+i));//isHeader==false时,TextView不会被赋值  
  49.             sectionData.add(new Section_titileBean("others "+i));  
  50.             titles[i] = "我是title: " + i;  
  51.             contentListCBox.add(false);  
  52.         }  
  53.         bean.contentListCBox = contentListCBox;  
  54.         bean.contentListT = contentListT;  
  55.         bean.titles = titles;  
  56.   
  57.         configurateRecyclerView(); //对RecyclerView进行各种效果配置  
  58.   
  59. //        quickAdapter.addData(data);//数据的添加,并自动刷新数据(方式一)  
  60.         data.add(3new MultyItemBean(false"我是被改变的类型一"0));//数据的添加,并自动刷新数据(方式二)  
  61.         data.add(6new MultyItemBean(false"我是被改的类型二"1));  
  62. //        quickAdapter.notifyItemInserted(1);//或者采用下边局部的刷新刷新方式  
  63.         dragAndSwipAdater.notifyItemRangeInserted(1,7);  
  64.     }  
  65.   
  66.     private void configurateRecyclerView() {  
  67.         //LayoutManager设置  
  68.         LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, OrientationHelper.VERTICAL, false);  
  69.         GridLayoutManager gridLayoutManager = new GridLayoutManager(this3, OrientationHelper.VERTICAL, false);  
  70.         StaggeredGridLayoutManager sglm = new StaggeredGridLayoutManager(4, OrientationHelper.VERTICAL);  
  71.   
  72.         //RecyclerView的adapter设置  
  73.         reAdapter = new ReAdapter(this, bean); //RecyclerView的baseAdapter  
  74.         //因为该adapter只用于单一类型holder,所以在设计时,在构造中就填入holder的view的id,而用于多类型的adapter则需要方法填充  
  75.         quickAdapter = new MyQuickAdapter(R.layout.adapter_content, data);  
  76.         multyItemAdapter = new MyMultitypeItemAdapter(data);//多类型条目  
  77.         sectionAdapter = new MySectionAdapter(R.layout.section_content_adapgter, R.layout.section_header_adapgter, sectionData);  
  78.         dragAndSwipAdater = new DragAndSwipAdater(data); //可拖拽和删除类型  
  79.   
  80.         //给Adapter设置拖拽和侧滑删除  
  81.         doDragAndSwipDelate();  
  82.   
  83.         //添加footer和heander  
  84.         dragAndSwipAdater.addHeaderView(getView(R.layout.refresh_header));//无监听效果,可以考虑放轮播图  
  85.         dragAndSwipAdater.addFooterView(getView(R.layout.refresh_footer));  
  86.         dragAndSwipAdater.setLoadingView(getView(R.layout.refresh_footer)); //设置了addFooterView()才能y9ong此法修改footerView  
  87.         dragAndSwipAdater.openLoadMore(40,true); //默认使用自己的footerView,更改的话需要先设置addFooterView(),然后在设置multyItemAdapter.setLoadingView(footerView)  
  88.         dragAndSwipAdater.setOnLoadMoreListener(this); //我测试时不起作用  
  89. //        dragAndSwipAdater.setAutoLoadMoreSize(3);  
  90.   
  91.         //添加分割线  
  92.         recyclerview.addItemDecoration(new DividerGridItemDecoration(this));  
  93. //        recyclerview.addItemDecoration(new RecycleLinearItemDecoration(this,RecycleLinearItemDecoration.VERTICAL_LIST));  
  94.   
  95.         //Item增删动画设置  
  96. //        recyclerview.setItemAnimator(new DefaultItemAnimator());//添加默认Item增删动画而非初始化时的动画  
  97. //        multyItemAdapter.openLoadAnimation();  //默认为渐显效果  
  98.         dragAndSwipAdater.isFirstOnly(false); //设置不仅是首次填充数据时有动画,以后滑动也会有动画  
  99.         //有5种动画可以设置,但若是多类型数据时,可能只有第一种类型(第0ViewType)数据有动画效果,也许被看成了单类型了  
  100.         dragAndSwipAdater.openLoadAnimation(BaseMultiItemQuickAdapter.SLIDEIN_LEFT);  
  101. //        multyItemAdapter.openLoadAnimation(new BaseAnimation() { //自定义动画  
  102. //            @Override  
  103. //            public Animator[] getAnimators(View view) {  
  104. //                return new Animator[]{  
  105. //                    ObjectAnimator.ofFloat(view, "scaleY", 0.3f, 5f, 1),  
  106. //                    ObjectAnimator.ofFloat(view, "scaleX", 0.3f, 8f, 1),  
  107. //                    ObjectAnimator.ofFloat(view, "rotation", 1, 60, 0)  
  108. //                };  
  109. //            }  
  110. //        });  
  111.   
  112.         recyclerview.setHasFixedSize(true); //保存item尺寸值,以便不在测量  
  113.         //RecyclerView的配置  
  114.         recyclerview.setLayoutManager(gridLayoutManager);  
  115.         recyclerview.setAdapter(dragAndSwipAdater);  
  116.     }  
  117.   
  118.     private void doDragAndSwipDelate() {  
  119.         //拖拽监听  
  120.         onItemDragListener = new OnItemDragListener() {  
  121.             @Override  
  122.             public void onItemDragStart(RecyclerView.ViewHolder viewHolder, int pos){}  
  123.             @Override  
  124.             public void onItemDragMoving(RecyclerView.ViewHolder source, int from, RecyclerView.ViewHolder target, int to) {}  
  125.             @Override  
  126.             public void onItemDragEnd(RecyclerView.ViewHolder viewHolder, int pos) {}  
  127.         };  
  128.   
  129.         //侧滑删除监听  
  130.         onItemSwipeListener = new OnItemSwipeListener() {  
  131.             @Override  
  132.             public void onItemSwipeStart(RecyclerView.ViewHolder viewHolder, int pos) {}  
  133.             @Override  
  134.             public void onItemSwipeMoving(Canvas canvas, RecyclerView.ViewHolder viewHolder, float v, float v1, boolean b) {  
  135.                 //设置滑动过程中划出部分的填补颜色  
  136.                 canvas.drawColor(ContextCompat.getColor(RecyclerViewActivity.this, R.color.colorAccent));  
  137.             }  
  138.             @Override  
  139.             public void onItemSwiped(RecyclerView.ViewHolder viewHolder, int pos) {  
  140.             }  
  141.             @Override  
  142.             public void clearView(RecyclerView.ViewHolder viewHolder, int pos) {  
  143.             }  
  144.         };  
  145.   
  146.         ItemDragAndSwipeCallback itemDragAndSwipeCallback = new ItemDragAndSwipeCallback(dragAndSwipAdater);  
  147.         ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemDragAndSwipeCallback);  
  148.         itemTouchHelper.attachToRecyclerView(recyclerview);  
  149.         itemDragAndSwipeCallback.setSwipeMoveFlags(ItemTouchHelper.START | ItemTouchHelper.END);//设置双向滑动功能  
  150.   
  151.          //开启长按拖拽功能  
  152.         dragAndSwipAdater.enableDragItem(itemTouchHelper);  
  153.         dragAndSwipAdater.setOnItemDragListener(onItemDragListener);  
  154.   
  155.         // 开启滑动删除功能  
  156.         dragAndSwipAdater.enableSwipeItem();  
  157.         //若不做特殊处理,可以不设置滑动或拖拽监听,其自动能实现拖拽或删除功能了  
  158.         dragAndSwipAdater.setOnItemSwipeListener(onItemSwipeListener);  
  159.     }  
  160.   
  161.     private View getView(int viewId) {  
  162.         return LayoutInflater.from(this).inflate(viewId, new RelativeLayout(this));  
  163.     }  
  164.   
  165.     @Override  
  166.     public int getContentId() {  
  167.         return R.layout.recyclerviewtext;  
  168.     }  
  169.   
  170.     @Override  
  171.     protected void onCreate(Bundle savedInstanceState) {  
  172.         super.onCreate(savedInstanceState);  
  173.         ButterKnife.bind(this);  
  174.     }  
  175.   
  176.     @Override  
  177.     public boolean onCreateOptionsMenu(Menu menu) {  
  178.         getMenuInflater().inflate(R.menu.main, menu);  
  179.         return super.onCreateOptionsMenu(menu);  
  180.     }  
  181.   
  182.     @Override  
  183.     public boolean onMenuItemClick(MenuItem item) {  
  184.         switch (item.getItemId()) {  
  185.             case R.id.acitonbar_add_menu:  
  186.                 reAdapter.addData(1);  
  187.                 break;  
  188.             case R.id.acitonbar_delate_menu:  
  189.                 reAdapter.removeData(1);  
  190.                 break;  
  191.         }  
  192.         return true;  
  193.     }  
  194.   
  195.     @Override  
  196.     public void onLoadMoreRequested() {  
  197.         new Handler().postDelayed(new Runnable() {  
  198.             @Override  
  199.             public void run() {  
  200.                 data.add(9new MultyItemBean(false"我是loadMore新加的item!"1));  
  201.                 dragAndSwipAdater.notifyDataChangedAfterLoadMore(data,true);  
  202.                 dragAndSwipAdater.openLoadMore(false);  
  203.             }  
  204.         }, 2111);  
  205.     }  
  206.   
  207.     public void changeShowView(final int CurentDataStatu){  
  208.         new Handler().postDelayed(new Runnable() {  
  209.             @Override  
  210.             public void run() {  
  211.                 if (CurentDataStatu == mError) {  
  212.                     dragAndSwipAdater.setEmptyView(getView(R.layout.errorview));  
  213.                 } else {  
  214.                     if (CurentDataStatu == mNoData) {  
  215.                         dragAndSwipAdater.setEmptyView(getView(R.layout.notdata_view));  
  216.                     } else {  
  217.                         dragAndSwipAdater.setNewData(data);  
  218.                     }  
  219.                 }  
  220.             }  
  221.         }, 1100);  
  222.     }  
  223. }  
public class RecyclerViewActivity extends BaseActivity implements Toolbar.OnMenuItemClickListener,BaseQuickAdapter.RequestLoadMoreListener{
    @Bind(R.id.recyclerview)
    RecyclerView recyclerview;
    @Bind(R.id.swipe_recycle_lt)
    SwipeRefreshLayout swipeRecycleLt;
    private RecycleBean bean;
    private List<Integer> contentListT;
    private String[] titles;
    private ArrayList<Boolean> contentListCBox;
    private ReAdapter reAdapter;
    private MyQuickAdapter quickAdapter;
    private ArrayList<MultyItemBean> data;
    private List<Section_titileBean> sectionData;
    private MyMultitypeItemAdapter multyItemAdapter;
    private OnItemDragListener onItemDragListener;
    private OnItemSwipeListener onItemSwipeListener;
    private DragAndSwipAdater dragAndSwipAdater;
    private int mError = 0;
    private int mNoData = 1;
    private int dataStatu = 1;
    private MySectionAdapter sectionAdapter;

    @Override
    protected void initView() {
        //Toobar的使用需要先fvb到Toobar布局,然后在MenuInflate到menu布局,同时给toobar设置点击监听
        Toolbar toolBar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolBar);
        toolBar.setTitle("ToolBarTitle");//设置标题
        toolBar.setNavigationIcon(R.mipmap.ic_launcher);//设置图标
        toolBar.setOnMenuItemClickListener(this);//设置Menu Item点击
    }

    @Override
    protected void initData() {
        //设置SwipeRefreshLayout刷新样式,颜色可以设置5种以上
        swipeRecycleLt.setColorSchemeColors(Color.RED, Color.BLUE, Color.GREEN,Color.BLACK,Color.YELLOW);
        //数据准备
        bean = new RecycleBean();
        data = new ArrayList<MultyItemBean>();
        sectionData = new ArrayList<>();
        contentListT = new ArrayList<Integer>();
        contentListCBox = new ArrayList<Boolean>();
        titles = new String[60];
        for (int i = 0; i < 30; i++) {
            contentListT.add(i);
            data.add(new MultyItemBean(true, String.valueOf(i),1));
            sectionData.add(new Section_titileBean(true,"header "+i));
            sectionData.add(new Section_titileBean(false,"is not header "+i));//isHeader==false时,TextView不会被赋值
            sectionData.add(new Section_titileBean("others "+i));
            titles[i] = "我是title: " + i;
            contentListCBox.add(false);
        }
        bean.contentListCBox = contentListCBox;
        bean.contentListT = contentListT;
        bean.titles = titles;

        configurateRecyclerView(); //对RecyclerView进行各种效果配置

//        quickAdapter.addData(data);//数据的添加,并自动刷新数据(方式一)
        data.add(3, new MultyItemBean(false, "我是被改变的类型一", 0));//数据的添加,并自动刷新数据(方式二)
        data.add(6, new MultyItemBean(false, "我是被改的类型二", 1));
//        quickAdapter.notifyItemInserted(1);//或者采用下边局部的刷新刷新方式
        dragAndSwipAdater.notifyItemRangeInserted(1,7);
    }

    private void configurateRecyclerView() {
        //LayoutManager设置
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, OrientationHelper.VERTICAL, false);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3, OrientationHelper.VERTICAL, false);
        StaggeredGridLayoutManager sglm = new StaggeredGridLayoutManager(4, OrientationHelper.VERTICAL);

        //RecyclerView的adapter设置
        reAdapter = new ReAdapter(this, bean); //RecyclerView的baseAdapter
        //因为该adapter只用于单一类型holder,所以在设计时,在构造中就填入holder的view的id,而用于多类型的adapter则需要方法填充
        quickAdapter = new MyQuickAdapter(R.layout.adapter_content, data);
        multyItemAdapter = new MyMultitypeItemAdapter(data);//多类型条目
        sectionAdapter = new MySectionAdapter(R.layout.section_content_adapgter, R.layout.section_header_adapgter, sectionData);
        dragAndSwipAdater = new DragAndSwipAdater(data); //可拖拽和删除类型

        //给Adapter设置拖拽和侧滑删除
        doDragAndSwipDelate();

        //添加footer和heander
        dragAndSwipAdater.addHeaderView(getView(R.layout.refresh_header));//无监听效果,可以考虑放轮播图
        dragAndSwipAdater.addFooterView(getView(R.layout.refresh_footer));
        dragAndSwipAdater.setLoadingView(getView(R.layout.refresh_footer)); //设置了addFooterView()才能y9ong此法修改footerView
        dragAndSwipAdater.openLoadMore(40,true); //默认使用自己的footerView,更改的话需要先设置addFooterView(),然后在设置multyItemAdapter.setLoadingView(footerView)
        dragAndSwipAdater.setOnLoadMoreListener(this); //我测试时不起作用
//        dragAndSwipAdater.setAutoLoadMoreSize(3);

        //添加分割线
        recyclerview.addItemDecoration(new DividerGridItemDecoration(this));
//        recyclerview.addItemDecoration(new RecycleLinearItemDecoration(this,RecycleLinearItemDecoration.VERTICAL_LIST));

        //Item增删动画设置
//        recyclerview.setItemAnimator(new DefaultItemAnimator());//添加默认Item增删动画而非初始化时的动画
//        multyItemAdapter.openLoadAnimation();  //默认为渐显效果
        dragAndSwipAdater.isFirstOnly(false); //设置不仅是首次填充数据时有动画,以后滑动也会有动画
        //有5种动画可以设置,但若是多类型数据时,可能只有第一种类型(第0ViewType)数据有动画效果,也许被看成了单类型了
        dragAndSwipAdater.openLoadAnimation(BaseMultiItemQuickAdapter.SLIDEIN_LEFT);
//        multyItemAdapter.openLoadAnimation(new BaseAnimation() { //自定义动画
//            @Override
//            public Animator[] getAnimators(View view) {
//                return new Animator[]{
//                    ObjectAnimator.ofFloat(view, "scaleY", 0.3f, 5f, 1),
//                    ObjectAnimator.ofFloat(view, "scaleX", 0.3f, 8f, 1),
//                    ObjectAnimator.ofFloat(view, "rotation", 1, 60, 0)
//                };
//            }
//        });

        recyclerview.setHasFixedSize(true); //保存item尺寸值,以便不在测量
        //RecyclerView的配置
        recyclerview.setLayoutManager(gridLayoutManager);
        recyclerview.setAdapter(dragAndSwipAdater);
    }

    private void doDragAndSwipDelate() {
        //拖拽监听
        onItemDragListener = new OnItemDragListener() {
            @Override
            public void onItemDragStart(RecyclerView.ViewHolder viewHolder, int pos){}
            @Override
            public void onItemDragMoving(RecyclerView.ViewHolder source, int from, RecyclerView.ViewHolder target, int to) {}
            @Override
            public void onItemDragEnd(RecyclerView.ViewHolder viewHolder, int pos) {}
        };

        //侧滑删除监听
        onItemSwipeListener = new OnItemSwipeListener() {
            @Override
            public void onItemSwipeStart(RecyclerView.ViewHolder viewHolder, int pos) {}
            @Override
            public void onItemSwipeMoving(Canvas canvas, RecyclerView.ViewHolder viewHolder, float v, float v1, boolean b) {
                //设置滑动过程中划出部分的填补颜色
                canvas.drawColor(ContextCompat.getColor(RecyclerViewActivity.this, R.color.colorAccent));
            }
            @Override
            public void onItemSwiped(RecyclerView.ViewHolder viewHolder, int pos) {
            }
            @Override
            public void clearView(RecyclerView.ViewHolder viewHolder, int pos) {
            }
        };

        ItemDragAndSwipeCallback itemDragAndSwipeCallback = new ItemDragAndSwipeCallback(dragAndSwipAdater);
        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemDragAndSwipeCallback);
        itemTouchHelper.attachToRecyclerView(recyclerview);
        itemDragAndSwipeCallback.setSwipeMoveFlags(ItemTouchHelper.START | ItemTouchHelper.END);//设置双向滑动功能

         //开启长按拖拽功能
        dragAndSwipAdater.enableDragItem(itemTouchHelper);
        dragAndSwipAdater.setOnItemDragListener(onItemDragListener);

        // 开启滑动删除功能
        dragAndSwipAdater.enableSwipeItem();
        //若不做特殊处理,可以不设置滑动或拖拽监听,其自动能实现拖拽或删除功能了
        dragAndSwipAdater.setOnItemSwipeListener(onItemSwipeListener);
    }

    private View getView(int viewId) {
        return LayoutInflater.from(this).inflate(viewId, new RelativeLayout(this));
    }

    @Override
    public int getContentId() {
        return R.layout.recyclerviewtext;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ButterKnife.bind(this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onMenuItemClick(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.acitonbar_add_menu:
                reAdapter.addData(1);
                break;
            case R.id.acitonbar_delate_menu:
                reAdapter.removeData(1);
                break;
        }
        return true;
    }

    @Override
    public void onLoadMoreRequested() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                data.add(9, new MultyItemBean(false, "我是loadMore新加的item!", 1));
                dragAndSwipAdater.notifyDataChangedAfterLoadMore(data,true);
                dragAndSwipAdater.openLoadMore(false);
            }
        }, 2111);
    }

    public void changeShowView(final int CurentDataStatu){
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                if (CurentDataStatu == mError) {
                    dragAndSwipAdater.setEmptyView(getView(R.layout.errorview));
                } else {
                    if (CurentDataStatu == mNoData) {
                        dragAndSwipAdater.setEmptyView(getView(R.layout.notdata_view));
                    } else {
                        dragAndSwipAdater.setNewData(data);
                    }
                }
            }
        }, 1100);
    }
}

总结:
可以用BaseMultiItemQuickAdapter代替BaseSectionQuickAdapter使用,也就是只用BaseMultiItemQuickAdapter和BaseItemDraggableAdapter就几乎能实现所需效果了. 有不足之处,希望大家给与指点!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值