第一步导入jar包
在app目录下的build.gradle文件中添加
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.22'
implementation 'com.android.support:recyclerview-v7:27.1.1'
再到工程目录下的build.gradle文件中添加
buildscript {
repositories {
jcenter()
mavenCentral()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.2'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
}
}
allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" }
google()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
这样在项目中就能使用Recyclerview和万能适配器BaseQuickAdapter了
第二步 当然是新建布局加入Recyclerview了,这里我加入了Google官方的下拉刷新控件SwipeRefreshLayout
初始化控件设置各种属性
/**
* 初始化View控件
*/
private void initView() {
refreshLayout=findViewById(R.id.swipe_refresh);
recyclerView=findViewById(R.id.recycler_view);
LinearLayoutManager layoutManager=new LinearLayoutManager(MainActivity.this);//创建为listview形式的recyclerview
recyclerView.setLayoutManager(layoutManager);//这一步必不可少,少了就什么都看不见了
refreshLayout.setColorSchemeResources(R.color.colorAccent);//这个方法是设置SwipeRefreshLayout刷新圈颜色
}
}
初始化数据源设置你需要的万能适配器
适配器的创建新建类 继承与 BaseQuickAdapter
public class MainActivityAdapter extends BaseQuickAdapter {
/**
*
* @param layoutResId recyclerview的item布局
* @param data 数据源的类型
*/
public MainActivityAdapter(int layoutResId, @Nullable List data) {
super(layoutResId, data);
}
/**
* 这个方法有点类似于原始适配器的onBindViewHolder方法
* @param helper
* @param item
*/
@Override
protected void convert(MyViewHodler helper, MainEntity item) {
//如果你想实现某一个控件的点击事件可以在这里添加监听,然后在activity中实现方法就可以了
helper.setText(R.id.text_content,item.getNaem()).addOnClickListener(R.id.text_content);
}
class MyViewHodler extends BaseViewHolder{
private TextView text_content;
public MyViewHodler(View view) {
super(view);
text_content=view.findViewById(R.id.text_content);
}
}
}
/**
* 初始化数据源设置各种属性
*/
private void initData() {
adapterListDate=new ArrayList<>();
adapter=new MainActivityAdapter(R.layout.activity_main_item,adapterListDate);
recyclerView.setAdapter(adapter);
}
添加列表所需要的功能,比如添加头部和设置数据显示动画,添加整个item的点击事件和某个控件的点击事件
View view= LayoutInflater.from(MainActivity.this)
.inflate(R.layout.headview_layout,null);
adapter.addHeaderView(view);//这是设置头部的方法,一个方法搞定,不需要跟以前一样去适配器里面判断一大堆,很方便
// adapter.addFooterView();有头当然有尾也是一个方法搞定
//开启动画(默认为渐显效果)
adapter.openLoadAnimation();
//这个方法有下面五个显示动画
// adapter.openLoadAnimation(BaseQuickAdapter.ALPHAIN);
// public static final int ALPHAIN = 0x00000001;
// public static final int SCALEIN = 0x00000002;
// public static final int SLIDEIN_BOTTOM = 0x00000003;
// public static final int SLIDEIN_LEFT = 0x00000004;
// public static final int SLIDEIN_RIGHT = 0x00000005;
//自动触发下拉刷新
recyclerView.postDelayed(new Runnable() {
@Override
public void run() {
//这个方法是让一进入页面的时候实现网络请求,有个缓冲的效果
refreshLayout.setRefreshing(true);
//模拟一下网络请求
page=1;//page为页数
loadDate(page);
}
}, 2000);
//手动刷新 触发SwipeRefreshLayout的下拉刷新方法
refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
isLoadMore = false;
handler.postDelayed(new Runnable() {
@Override
public void run() {
//模拟一下网络请求
page=1;
loadDate(page);
}
}, 2000);
}
});
adapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() {
@Override
public void onLoadMoreRequested() {
//这个是适配器自带的上拉加载功能 很方便一个实现方法搞定
isLoadMore = true;
handler.postDelayed(new Runnable() {
@Override
public void run() {
//模拟一下网络请求
page++;
loadDate(page);
}
}, 2000);
}
}, recyclerView);
adapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
@Override
public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
//这个是整个item的点击事件,我们可以在这里做一些操作
Toast.makeText(MainActivity.this,"我是第"+page+"页的第" + position + "位置",Toast.LENGTH_SHORT).show();
}
});
adapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
@Override
public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
//看清楚这个是某一个控件的点击方法,不要搞混
Toast.makeText(MainActivity.this,"我是控件第"+page+"页的第" + position + "位置",Toast.LENGTH_SHORT).show();
}
});
然后模拟一下网络请求加载数据
/**
* 添加数据源数据 相当于网络请求
*/
private void loadDate(int page) {
if (refreshLayout.isRefreshing()) {
refreshLayout.setRefreshing(false);
}
List date=new ArrayList<>();
//isLoadMore是用来区分下拉刷新和上拉加载的数据添加
if (isLoadMore) {
for (int i = 0; i <= 15; i++) {
date.add("我是第"+page+"页的第" + i + "行");
}
adapterListDate.addAll(date);
adapter.notifyDataSetChanged();
//这个方法必须的写上 它有好几种情况,可以根据需求自己定义
adapter.loadMoreComplete();//结束这次加载,不写的话上拉加载就会一直在那转圈
}else{
adapterListDate.clear();
for (int i = 0; i <= 15; i++) {
date.add("我是第"+page+"页的第" + i + "行");
}
adapterListDate.addAll(date);
adapter.notifyDataSetChanged();
adapter.loadMoreComplete();
}
}
好了 这样一个有头、有尾、有下拉刷新、有上拉加载更多的recyclerview就完成了,很简单吧!功能有很多,有时间再探索吧!
标题
送上Demo
https://download.csdn.net/download/chengxuyuanchaochao/10545453