YRecyclerView自定义下拉刷新上拉加载更多的RecyclerView

由于最近公司不是特别忙,于是抽空闲时间。三天打鱼,两天晒网之式。。写了自己第一个下拉刷新上拉加载更多的控件。改控件除了以上功能,还实现了。自定义下拉header和自定义上拉footer.,以及emptyView,和onItemClicklistener,onItemLongClickListener..

下面就大致介绍一下功能的使用方式:




1、设置上拉和下拉模式:


yRecyclerView.setTypeMode(typeMode);


public enum  TypeMode {
    NONE, //没有头部和底部
    ONLY_REFRESH, //只有下拉刷新
    ONLY_LOAD_MORE, //只有上拉加载更多
    BOTH   //下拉刷新+上拉加载更多
}

设置每页数据条数,如果数据条数不是传入参数的整数倍,表示没有更多的数据了,将不能加载更多

yRecyclerView.setPageCount(5);


手动设置没有更多数据了

yRecyclerView.setHaveNoMoreData();


数据加载完成之后。调用值方法重置加载界面

yRecyclerView.completeLoading();


下面是设置 空布局以及 事件监听。

如果 typeMode 使用的 BOTH   就是用 OnBothLoadListener,如果使用的ONLY_REFRESH 就是用 OnRefreshOnlyListener,如果是

ONLY_LOAD_MORE ,就可以 OnLoadMoreOnlyListener,当然如果你不觉得麻烦,可以随意使用,不会出错。

        yRecyclerView.setEmptyView(R.layout.empty_view);
        //设置PageCountz之后。如果 item 数不是 count 的整数倍就不能上拉加载更多
//        yRecyclerView.setPageCount(5);
        yRecyclerView.setOnBothLoadListener(new OnBothLoadListener() {
            @Override
            public void onRefresh() {
                handler.sendEmptyMessageDelayed(10086, 5000);
            }

            @Override
            public void onLoadMore() {
                handler.sendEmptyMessageDelayed(10010, 5000);
            }
        });

        adapter.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                Toast.makeText(ActYRecyclerViewDemo.this,"您点击了第"+ position +"项",Toast.LENGTH_SHORT).show();
            }
        });
        yRecyclerView.setOnItemLongClickListener(new OnItemLongClickListener() {
            @Override
            public void onItemLongClick(int position) {
                Toast.makeText(ActYRecyclerViewDemo.this,"您长按了第"+ position +"项",Toast.LENGTH_SHORT).show();
            }
        });
    }

2、下面介绍一下adapter 的使用  这里的adapter 必须继承 YRecyclerViewAdapter。


public class BothHaveAnimAdapter extends YRecyclerViewAdapter {

    private Context context;
    private List<String> listStr ;

    public BothHaveAnimAdapter(Context context, List<String> listStr) {
        super(context);
        this.context = context;
        this.listStr = listStr;
    }

    /*

   如果不重新   addFooter  addHeader 这两个方法,就使用默认的header  和footer (没有帧动画)
     */

    @Override
    public BaseLayout addFooter(Context context, boolean isAnim) {
        /*
        true  表示有帧动画  ,false  表示 无帧动画
         */
        return super.addFooter(context, true);
    }

    @Override
    public BaseLayout addHeader(Context context, boolean isAnim) {
        return super.addHeader(context, true);
    }


    @Override
    public int getItemSize() {
        return listStr.size();
    }

    @Override
    public void onBindViewMHolder(RecyclerView.ViewHolder holder, int position) {
        MViewHolder mViewHolder = (MViewHolder) holder;
        mViewHolder.tvTitle.setText("-->" + position);
        mViewHolder.tvContent.setText(listStr.get(position));
    }

    @Override
    public RecyclerView.ViewHolder onMCreateViewHolder(ViewGroup parent, int viewType) {
        return new MViewHolder(LayoutInflater.from(context).inflate(R.layout.item_layout, parent, false));
    }

    private class MViewHolder extends RecyclerView.ViewHolder {

        public TextView tvTitle;
        public TextView tvContent;

        public MViewHolder(View itemView) {
            super(itemView);
            tvTitle = (TextView) itemView.findViewById(R.id.tvTitle);
            tvContent = (TextView) itemView.findViewById(R.id.tvContent);
        }
    }
}

是不是看起来也很简单。如果要重写添加自己自定义的header  和footer 只需要重新 addFooter 和 addHeader,将返回值 改为自己的header 活footer

@Override
public BaseLayout addFooter(Context context, boolean isAnim) {
    return new AnimFooterView(context,true);
}

像这样。如果你的footer要支持帧动画。isAnim = true,其他的使用都和往常的一样

然后说说自定义header  好footer,必须继承至 BaseLayout,

拿内置的Header 为例:

public class YHeaderView extends BaseLayout {
    private ImageView imgRefresh;
    private TextView tvRefreshNotice;
//    private String[] viewStr = new String[]{"继续下拉", "松手进行刷新", "加载中", "加载完成"};

    public YHeaderView(Context context, boolean isSupportAnim) {
        super(context);
        /*
        如果支持帧动画就在这里插入资源
         */
        if (isSupportAnim) {
            int[] imgPullDownRes = new int[]{R.mipmap.pull_end_image_frame_01, R.mipmap.pull_end_image_frame_02, R.mipmap.pull_end_image_frame_03, R.mipmap.pull_end_image_frame_04, R.mipmap.pull_end_image_frame_05};
            int[] imgRefreshRes = new int[]{R.mipmap.progress_loading_image_01, R.mipmap.progress_loading_image_02, R.mipmap.progress_loading_image_03, R.mipmap.progress_loading_image_04};
            setPullDownImg(imgRefresh, imgPullDownRes, imgRefreshRes);
            setSupportAnim(true);
        }
    }

    /**
     * 绑定控件
     * @return  控件layout   id
     */
    @Override
    int bindView() {
        return R.layout.header_view;
    }

    @Override
    void getCurrentContainer(ViewGroup mContainer) {
        imgRefresh = (ImageView) mContainer.findViewById(R.id.imgRefresh);
        tvRefreshNotice = (TextView) mContainer.findViewById(R.id.tvRefreshNotice);
    }

    /**
     * 是否是头部  true --> header   :  false  -->footer
     * @return
     */
    @Override
    boolean isHeaderView() {
        return true;
    }


    /**
     * 拉拽过程
     */
    @Override
    public void onPull() {
        tvRefreshNotice.setText(getPullText());
        if (imgRefresh.getVisibility() != VISIBLE) {
            imgRefresh.setVisibility(VISIBLE);
        }
        rotationAnimStraighten(imgRefresh);
    }

    /**
     * 拉拽超过最大距离
     */
    @Override
    public void onExceedMaximum() {
        tvRefreshNotice.setText(getExceedMaximumText());
        if (imgRefresh.getVisibility() != VISIBLE) {
            imgRefresh.setVisibility(VISIBLE);
        }
        rotationAnimTakeBack(imgRefresh);
    }

    /**
     * 加载中
     */
    @Override
    public void onLoading() {
        tvRefreshNotice.setText(getLoadingText());
        if (imgRefresh.getVisibility() != VISIBLE) {
            imgRefresh.setVisibility(VISIBLE);
        }
        imgRefresh.setImageResource(R.mipmap.icon_refresh);
        flipAnim360(imgRefresh);

    }

    /**
     *加载完成
     */
    @Override
    public void onLoadingOver() {
        rotationAnimStraighten(imgRefresh);
        imgRefresh.setVisibility(GONE);
        imgRefresh.clearAnimation();
        tvRefreshNotice.setText(getLoadingOverText());
    }

    /**
     * 复原
     */
    @Override
    void onReset() {
        imgRefresh.setVisibility(VISIBLE);
        tvRefreshNotice.setText(getPullText());
        imgRefresh.setImageResource(R.mipmap.icon_refresh_arrow);

    }

    /**
     * 拉拽距离
     * @param pullDistance  拉拽的像素值
     * @param pullFraction  拉拽的距离相对于设置的最大值比例
     */
    @Override
    void pulledDistance(int pullDistance, float pullFraction) {
        super.pulledDistance(pullDistance, pullFraction);
    }
}

如果你需要自定义自己的header  或者footer  那么继承BaseLayout 即可,然后在对应的方法里面处理对应的业务,

这里要注意,这个值得返回

/**
 * 是否是头部  true --> header   :  false  -->footer
 * @return
 */
@Override
boolean isHeaderView() {
    return true;
}

因为在baseLayout里面已经提供了一些文字资源

private String[] viewLoadMoreStr = new String[]{"继续上拉加载更多数据", "松手加载数据", "加载数据中", "加载完成"};
private String[] viewPullDownStr = new String[]{"继续下拉", "松手进行刷新", "加载中", "加载完成"};
在header  和 footer  里面也提供了帧动画图片资源,当然这里用的是美团 和糯米的图片在使用的时候你们自己也会修改:

如果你自己的提示和我里面的不一样,但是你有不想重新自定义header 或者footer  ,那么在YRecyclerView  也提供了相应的方法:

 

public void setImgPullDownRes(int[] imgPullDownRes)

public void setImgRefreshRes(int[] imgRefreshRes) 

public void setImgPullUpRes(int[] imgPullUpRes)

public void setImgLoadingRes(int[] imgLoadingRes)


public final void setRefreshStr(String[] refreshStr) --->String[] .ength 必须==4

public final void setLoadMoreStr(String[] loadMoreStr) --->String[]  .length 必须==4


如果长度不为4,请通过自定义header 或footer实现

另外是提供了只修改单个提示的方法:

public final void setPullDownText(String pullStr)

public final void setPullUpText(String pullStr)

public final void setPullDownExceedMaximumText(String exceedMaximumStr)

public final void setPullUpExceedMaximumText(String exceedMaximumStr)

public final void setLoadingText(String loadingStr)

public final void setRefreshingText(String refreshingStr)

public final void setRefreshingOverText(String refreshingOverStr)

public final void setLoadingOverText(String loadingOverStr) 

每个方法具体意思就不多做介绍。就是字面上的意思。


其实里面还有一些功能没有写。不过也不是什么难的地方。如果你们自己需要可以自己修改,而且里面的实现方案不一定是最好的,如果有什么不好的地方可以评论告诉我。我做优化。这个也算是我目前开源出来的第一个控件吧。希望以后能有更多的提供出来。


由于在功能不能配置git,就只能上传到 CSDN了,有需要的就自己下载了。还有就是此文目前没有一张案例图片,因为目前不知道用什么录制屏幕更好。有知道的告知我可好。

http://download.csdn.net/detail/yyxxll2/9638478







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值