前言:
我们在上一篇文章中学到了recyclerview但是在现实中往往需求不是那么的简单,可能需要多种需求合并起来,例如常见的上下拉刷新,删除 item 还有多种item,有着头部和尾部等等之类的。这次我们久来学习一个recyclerview的库,xrecyclerview的他集合了众多的功能,下面就让我来讲解一下如何使用。
步骤:
- 引用 库
- 创建 控件
- 下拉刷新
- 设置上拉下拉刷新的样式
- 创建头部
- 设置上下拉的文字提示语
- 设置刷新的回调
- 更新完毕
- 实战过程
- 彩蛋
- 我的案例
引用库
compile 'com.jcodecraeer:xrecyclerview:1.5.8'
创建控件
设置是否可以上下拉刷新(默认是可以的)
recyclerview.setpullrefreshenabled(true); recyclerview.setloadingmoreenabled(false);
设置上拉下拉刷新的样式
recyclerview.setrefreshprogressstyle(progressstyle.ballspinfadeloader); recyclerview.setloadingmoreprogressstyle(progressstyle.ballrotate); recyclerview.setarrowimageview(r.drawable.iconfont_downgrey);
设置头部
recyclerview .getdefaultrefreshheaderview() .setrefreshtimevisible(true); view header = layoutinflater.from(this).inflate(r.layout.recyclerview_header,(viewgroup)findviewbyid(android.r.id.content),false); recyclerview.addheaderview(header);
设置上下拉的文字提示语
// recyclerview.getdefaultfootview().setloadinghint("自定义加载中提示"); recyclerview.getdefaultfootview().setnomorehint("自定义加载完毕提示");
设置刷新的回调(onrefrsh为刷新回调,onloadmore为下拉更新)
recyclerview.setloadinglistener(new xrecyclerview.loadinglistener() { @override public void onrefresh() { new handler().postdelayed(new runnable(){ public void run() { internextdata(2); } }, 2000); } @override public void onloadmore() { } });
更新完毕
lists.clear(); lists.addall( readalllock.arraydemofromdata(body)); adapter.notifydatasetchanged(); recyclerview.refreshcomplete();
实战过程
默认初级进入页面的时候先加载好数据使我们的网络请求函数,多加上一个参数区分 初始化网络 下拉刷新 下拉添加数据的操作
彩蛋
顺便讲一下一点更新数据的问题 ,使用下面语句来更新的时候我们必须更新我一初始化的数据内存,不能让引用指向另一内存
adapter.notifydatasetchanged();
我的案例
package com.ly.project.view; import android.os.handler; import android.support.v7.widget.linearlayoutmanager; import android.support.v7.widget.recyclerview; import android.support.v7.widget.staggeredgridlayoutmanager; import android.util.log; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.toast; import com.ly.basemodule.essential.basetemplate.baseactivity; import com.ly.project.adapter.demoadapter; import com.ly.project.adapter.mylockadapter; import com.ly.project.controller.lockcontroller; import com.ly.project.manager.interfacemanger; import com.ly.project.module.readalllock; import com.ly.project.r; import com.ly.project.utils.retrofitutils; import com.google.gson.gson; import com.google.gson.jsonarray; import com.google.gson.jsonelement; import com.google.gson.jsonparser; import com.jcodecraeer.xrecyclerview.progressstyle; import com.jcodecraeer.xrecyclerview.xrecyclerview; import java.util.arraylist; import java.util.hashmap; import java.util.list; import java.util.map; import okhttp3.multipartbody; import okhttp3.requestbody; /** * created by jie on 2018/8/17. */ public class demo extends baseactivity { listlists = new arraylist<>(); private xrecyclerview recyclerview; private demoadapter adapter; @override public int getlayoutid() { return r.layout.demo; } @override public void initviews() { recyclerview = findview(r.id.rv); initr(); } /** * 初始化控件 */ private void initr() { /* * 默认为垂直向下的列表格式 */ linearlayoutmanager layoutmanager = new linearlayoutmanager(getapplication()); /** * 设置为水平布局格式 */ // layoutmanager.setorientation(linearlayoutmanager.horizontal); /* * 瀑布格式 * 第一个参数表示布局的列数 * 第二个参数表示布局的方向,这里我们传入staggeredgridlayoutmanager.vertical,表示布局纵向排列 */ // staggeredgridlayoutmanager layoutmanager = new staggeredgridlayoutmanager(2, staggeredgridlayoutmanager.vertical); //设置recyclerview 布局 recyclerview.setlayoutmanager(layoutmanager); recyclerview.setpullrefreshenabled(true); recyclerview.setloadingmoreenabled(false); recyclerview.setrefreshprogressstyle(progressstyle.ballspinfadeloader); recyclerview.setloadingmoreprogressstyle(progressstyle.ballrotate); recyclerview.setarrowimageview(r.drawable.iconfont_downgrey); recyclerview .getdefaultrefreshheaderview() .setrefreshtimevisible(true); view header = layoutinflater.from(this).inflate(r.layout.recyclerview_header, (viewgroup)findviewbyid(android.r.id.content),false); recyclerview.addheaderview(header); // recyclerview.getdefaultfootview().setloadinghint("自定义加载中提示"); recyclerview.getdefaultfootview().setnomorehint("自定义加载完毕提示"); } /** * 初始化点击事件 */ @override public void initlistener() { recyclerview.setloadinglistener(new xrecyclerview.loadinglistener() { @override public void onrefresh() { new handler().postdelayed(new runnable(){ public void run() { internextdata(2); } }, 2000); } @override public void onloadmore() { } }); } /** * 初始化数据 */ @override public void initdata() { internextdata(1); } /** * 获取数据 * @param type tyoe==1 初次获取数据 type == 2 刷新获取数据 type == 3 下拉更新数据 */ private void internextdata(final int type) { lockcontroller lockcontroller = new lockcontroller(demo.this); list photos = new arraylist<>(); list parts = null; map params = new hashmap<>(); params.put("phone", retrofitutils.converttorequestbody("17875305749")); params.put("password", retrofitutils.converttorequestbody("1234567")); lockcontroller.readalllock(params, parts, new interfacemanger.onrequestlistener() { @override public void onsuccess(object success) { string body = success.tostring(); log.e("onsuccess:", body); switch (type){ case 1: lists = readalllock.arraydemofromdata(body); //设置adapter adapter = new demoadapter(lists); adapter.setonitemclicklistener(new demoadapter.onitemclicklistener() { @override public void onlongclick(int position) { toast.maketext(demo.this, "onlongclick事件 您点击了第:" position "个item", toast.length_short).show(); } @override public void onclick(int position) { toast.maketext(demo.this, "onclick事件 您点击了第:" position "个item", toast.length_short).show(); } }); recyclerview.setadapter(adapter); recyclerview.refresh(); break; case 2: lists.clear(); lists.addall( readalllock.arraydemofromdata(body)); adapter.notifydatasetchanged(); recyclerview.refreshcomplete(); break; default: break; } } @override public void onerror(string error) { showtoast(error); } @override public void oncomplete() { } }); } @override public void processclick(view v) { } }