强大的BaseRecyclerViewAdapterHelper使用

来源:互联网 发布:阿里云服务器视频教程 编辑:程序博客网 时间:2024/06/05 23:51

介绍

这里写图片描述
相信大家RecyclerView应该不会陌生,大多数开发者应该都使用上它了,它也是google推荐替换ListView的控件,但是用过它的同学应该都知道它在某些方面并没有ListView使用起来方便,需要我们额外的编写代码,今天就给大家介绍一个开源库BaseRecyclerViewAdapterHelper,有了它让你使用RecyclerView的时候,和ListView一样的好用! 
那么你要问了,BaseRecyclerViewAdapterHelper能做什么? 
优化Adapter代码(减少百分之70%代码) 
添加点击item点击、长按事件、以及item子控件的点击事件 
添加加载动画(一行代码轻松切换5种默认动画) 
添加头部、尾部、下拉刷新、上拉加载(感觉又回到ListView时代) 
设置自定义的加载更多布局 
添加分组(随心定义分组头部) 
自定义不同的item类型(简单配置、无需重写额外方法) 
设置空布局(比Listview的setEmptyView还要好用!) 
添加拖拽item

如何使用它?

先在 build.gradle 的 repositories 添加:

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

然后增加dependencies

dependencies {   compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:v1.9.7'}
  • 1
  • 2
  • 3

官网为准

如何使用它来创建Adapter?

public class QuickAdapter extends BaseQuickAdapter<Status> {    public QuickAdapter(Context context) {        super(context, R.layout.tweet, DataServer.getSampleData());    }    @Override    protected void convert(BaseViewHolder helper, Status item) {        helper.setText(R.id.tweetName, item.getUserName())                .setText(R.id.tweetText, item.getText())                .setText(R.id.tweetDate, item.getCreatedAt())                .setImageUrl(R.id.tweetAvatar, item.getUserAvatar())                .setVisible(R.id.tweetRT, item.isRetweet())                .linkify(R.id.tweetText);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

或者

public class QuickAdapter extends BaseQuickAdapter<Status> {      public QuickAdapter() {          super(R.layout.tweet, DataServer.getSampleData());      }      @Override      protected void convert(BaseViewHolder helper, Status item) {          helper.setText(R.id.tweetName, item.getUserName())                  .setText(R.id.tweetText, item.getText())                  .setText(R.id.tweetDate, item.getCreatedAt())                  .setVisible(R.id.tweetRT, item.isRetweet())                  .linkify(R.id.tweetText);                   Glide.with(mContext).load(item.getUserAvatar()).crossFade().into((ImageView) helper.getView(R.id.iv));      }  }  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

添加item点击事件

mQuickAdapter.setOnRecyclerViewItemClickListener(new BaseQuickAdapter.OnRecyclerViewItemClickListener() {            @Override            public void onItemClick(View view, int position) {            }});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

添加动画

// 一行代码搞定(默认为渐显效果)quickAdapter.openLoadAnimation();
  • 1
  • 2

不喜欢渐显动画可以这样更换

// 默认提供5种方法(渐显、缩放、从下到上,从左到右、从右到左)quickAdapter.openLoadAnimation(BaseQuickAdapter.ALPHAIN);
  • 1
  • 2

另外,如果内置的动画效果不满意,也可易自定义

// 自定义动画如此轻松quickAdapter.openLoadAnimation(new BaseAnimation() {                            @Override                            public Animator[] getAnimators(View view) {                                return new Animator[]{                                        ObjectAnimator.ofFloat(view, "scaleY", 1, 1.1f, 1),                                        ObjectAnimator.ofFloat(view, "scaleX", 1, 1.1f, 1)                                };                            }                        });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

使用它添加头部添加尾部

这里写图片描述

mQuickAdapter.addHeaderView(getView());mQuickAdapter.addFooterView(getView());
  • 1
  • 2

添加多种类型item

public class MultipleItemQuickAdapter extends BaseMultiItemQuickAdapter<MultipleItem> {    public MultipleItemQuickAdapter(Context context, List data) {        super(context, data);        addItmeType(MultipleItem.TEXT, R.layout.text_view);        addItmeType(MultipleItem.IMG, R.layout.image_view);    }    @Override    protected void convert(BaseViewHolder helper, MultipleItem item) {        switch (helper.getItemViewType()) {            case MultipleItem.TEXT:                helper.setImageUrl(R.id.tv, item.getContent());                break;            case MultipleItem.IMG:                helper.setImageUrl(R.id.iv, item.getContent());                break;        }    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

使用它加载更多

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);                }            }        });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

使用分组

public class SectionAdapter extends BaseSectionQuickAdapter<MySection> {     public SectionAdapter(Context context, int layoutResId, int sectionHeadResId, List data) {        super(context, layoutResId, sectionHeadResId, data);    }    @Override    protected void convert(BaseViewHolder helper, MySection item) {        helper.setImageUrl(R.id.iv, (String) item.t);    }    @Override    protected void convertHead(BaseViewHolder helper,final MySection item) {        helper.setText(R.id.header, item.header);        if(!item.isMroe)helper.setVisible(R.id.more,false);        else        helper.setOnClickListener(R.id.more, new View.OnClickListener() {            @Override            public void onClick(View v) {                Toast.makeText(context,item.header+"more..",Toast.LENGTH_LONG).show();            }        });    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

使用setEmptyView

mQuickAdapter.setEmptyView(getView());
  • 1

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

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

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();            }        });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

实现拖拽 
以前用listview或者gridview进行拖拽是很麻烦的,现在好了,使用RecyclerView可以很方便的实现拖拽,想怎么拖就怎么拖

OnItemDragListener 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 onItemSwipeListener = new OnItemSwipeListener() {      @Override      public void onItemSwipeStart(RecyclerView.ViewHolder viewHolder, int pos) {}      @Override      public void clearView(RecyclerView.ViewHolder viewHolder, int pos) {}      @Override      public void onItemSwiped(RecyclerView.ViewHolder viewHolder, int pos) {}  };  ItemDragAndSwipeCallback itemDragAndSwipeCallback = new ItemDragAndSwipeCallback(mAdapter);  ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemDragAndSwipeCallback);  itemTouchHelper.attachToRecyclerView(mRecyclerView);  // 开启拖拽  mAdapter.enableDragItem(itemTouchHelper, R.id.textView, true);  mAdapter.setOnItemDragListener(onItemDragListener);  // 开启滑动删除  mAdapter.enableSwipeItem();  mAdapter.setOnItemSwipeListener(onItemSwipeListener);  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

BaseRecyclerViewAdapterHelper还能实现很多功能,这里我就不详解了,有需要的可以直接到git上下载下来体验体验 点击查看

参考别人Demo

简单使用

这里写图片描述

public class MultipleItemAdapter extends BaseQuickAdapter<String> {    private final int TEXT_TYPE = 1;    private int mTextLayoutResId;    public MultipleItemAdapter(Context context, List data, int... layoutResId) {        super(context, layoutResId[0], data);        mTextLayoutResId = layoutResId[1];    }    @Override    protected int getDefItemViewType(int position) {        if (position % 2 == 0)            return TEXT_TYPE;        return super.getDefItemViewType(position);   }    @Override    protected BaseViewHolder onCreateDefViewHolder(ViewGroup parent, int viewType) {        if (viewType == TEXT_TYPE)            return new TextViewHolder(getItemView(mTextLayoutResId, parent));        return super.onCreateDefViewHolder(parent, viewType);    }    @Override    protected void onBindDefViewHolder(BaseViewHolder holder, String item) {        if (holder instanceof TextViewHolder)            holder.setText(R.id.tv, item);    }    @Override    protected void convert(BaseViewHolder helper, String item) {        helper.setImageUrl(R.id.iv, item);    }    public class TextViewHolder extends BaseViewHolder {        public TextViewHolder(View itemView) {            super(itemView.getContext(), itemView);        }    }}
原创粉丝点击