前言:我们在上一篇文章中学到了Recyclerview但是在现实中往往需求不是那么的简单,可能需要多种需求合并起来,例如常见的上下拉刷新,删除 item 还有多种item,有着头部和尾部等等之类的。这次我们久来学习一个RecyclerView的库,XRecyclerView的他集合了众多的功能,下面就让我来讲解一下如何使用。
步骤:
- 引用 库
- 创建 控件
- 下拉刷新
- 设置上拉下拉刷新的样式
- 创建头部
- 设置上下拉的文字提示语
- 设置刷新的回调
- 更新完毕
- 实战过程
- 彩蛋
- 我的案例
引用库
compile 'com.jcodecraeer:xrecyclerview:1.5.8'
创建控件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.jcodecraeer.xrecyclerview.XRecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="wrap_content"></com.jcodecraeer.xrecyclerview.XRecyclerView>
</LinearLayout>
设置是否可以上下拉刷新(默认是可以的)
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 {
List<ReadAllLock> lists = 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<String> photos = new ArrayList<>();
List<MultipartBody.Part> parts = null;
Map<String, RequestBody> 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) {
}
}
thanks