让多种类型item的Recyclerview能够上拉和下拉刷新--XRefreshView

来源:互联网 发布:android ble 写数据 编辑:程序博客网 时间:2024/06/08 14:09

什么是XRefreshView

XRefreshView是一款支持任何view上拉加载和下拉刷新的库,之所以说是任何view,是因为他不仅在内部适配了Recyclerview,abslistview,scrollview,webview等view,还提供了让你自己去判断view到达顶部和底部的方法,就像这样,

    refreshView.setOnTopRefreshTime(new OnTopRefreshTime() {                  @Override                  public boolean isTop() {                      return stickyLv.getFirstVisiblePosition() == 0;                  }              });              refreshView.setOnBottomLoadMoreTime(new OnBottomLoadMoreTime() {                  @Override                  public boolean isBottom() {                      return stickyLv.getLastVisiblePosition() == mTotalItemCount - 1;                  }              });  

当isTop返回true,就会触发下拉刷新;当isBottom()返回true,就会触发上拉加载。此外还能自己定义刷新的头部和加载的底部,具体的用法可以参考github上给的demo和我之前写的博客。我会在文章末尾处贴出来。

支持多种类型的item

背景

前段时间有不少朋友都问我用XRefreshView刷新Recyclerview的时候,Recyclerview怎么支持多种类型的item,其实XRefreshView很早就支持这个功能了,但是很多人可能并不清楚怎么支持,所以我感觉有必要单独写篇博客来说明下这个问题。

效果图

效果图
能看到效果图上Recyclerview有文字在左边和文字在右边这两种布局。demo写的比较简陋,但是也能解决问题。接下来看具体操作。

步骤

RecyclerView的adapter得继承BaseRecyclerAdapter

public class MultiItemAdapter extends BaseRecyclerAdapter<MultiItemAdapter.SimpleAdapterViewHolder> {    /**     * 替代onBindViewHolder方法,实现这个方法就行了     */    @Override    public void onBindViewHolder(SimpleAdapterViewHolder holder, int position, boolean isItem) {         Person person = list.get(position);        int type = getAdapterItemViewType(position);        if (type == 0) {            holder.tvLeft.setText(person.getName());        } else {            holder.tvRight.setText(person.getName());        }    }    /**     * 实现此方法来设置viewType     */    @Override    public int getAdapterItemViewType(int position) {        if (list != null && list.size() > 0) {            return list.get(position).getType();        }        return 0;    }    /**     * 设置Recyclerview上数据的数量,代替getAdapterCount()     */    @Override    public int getAdapterItemCount() {        return list.size();    }    /**     * 用来设置headerview和footerview的viewholder的,只需要返回一个viewholder,这么写就行了     */    @Override    public SimpleAdapterViewHolder getViewHolder(View view) {        return new SimpleAdapterViewHolder(view, false);    }    public void setData(List<Person> list) {        this.list = list;        notifyDataSetChanged();    }    /**     * 替代onBindViewHolder方法,实现这个方法就行了     */    @Override    public SimpleAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType, boolean isItem) {        View v = null;        if (viewType == 0) {            v = LayoutInflater.from(parent.getContext()).inflate(                    R.layout.item_left_recylerview, parent, false);        } else {            v = LayoutInflater.from(parent.getContext()).inflate(                    R.layout.item_right_recylerview, parent, false);        }        return new SimpleAdapterViewHolder(v, viewType, true);    }    public class SimpleAdapterViewHolder extends RecyclerView.ViewHolder {         public TextView tvRight, tvLeft;        public SimpleAdapterViewHolder(View itemView, boolean isItem) {            super(itemView);            init(itemView, -1, isItem);        }        public SimpleAdapterViewHolder(View itemView, int viewType, boolean isItem) {            super(itemView);            init(itemView, viewType, isItem);        }        private void init(View itemView, int viewType, boolean isItem) {            if (isItem) {                switch (viewType) {                    case 0:                        tvLeft= (TextView) itemView.findViewById(R.id.tv_multi_left);                        break;                    default:                        tvRight= (TextView) itemView.findViewById(R.id.tv_multi_right);                        break;                }            }        }    }  ...省略部分代码...}
  1. 先通过getAdapterItemViewType()来设置item的viewtype,设置好viewtype以后,接下来就是使用这个viewtype了;
  2. 在onCreateViewHolder(ViewGroup parent, int viewType, boolean isItem)里根据viewtype创建不同布局的viewholder,并给根据viewtype给viewholder中的控件赋值;
  3. 最后在onBindViewHolder()中根据viewtype给不同的控件设置ui。

不过有点是需要注意的,BaseRecyclerAdapter的headerview和footerview也是有viewtype,所以在考虑viewtype值的时候,不能和headerview和footerview的viewtype冲突。

  protected class VIEW_TYPES {        public static final int FOOTER = -1;        public static final int HEADER = -3;        public static final int NORMAL = -4;    }

上面就是BaseRecyclerAdapter用到的viewtype的值,注意下就行了。

其实还有很多特性,例如Recyclerview上拉加载结束以后不隐藏footerview,或者数据加载完成以后footerview显示 没有更多内容,考虑下篇博客再介绍吧。其实这些特性在github上的demo里都有写到,看看代码就能找到,如果有使用上的问题,欢迎来github上找到我。

相关博客:

打造Android万能上拉下拉刷新框架–XRefreshView(一)
打造Android万能上拉下拉刷新框架–XRefreshView(二)
打造Android万能上拉下拉刷新框架–XRefreshView(三)
由拉钩app引起的故事

github

https://github.com/huxq17/XRefreshView

预告

悬浮球
下篇博客是关于悬浮球的,相较于网上大多数悬浮球来说,这个悬浮球最大优点是不需要权限,具体的会在博客里说明。代码已经在github上了,点我获取源码,有需要可以先看看。

3 1
原创粉丝点击