使用RecyclerView要引用对应的jar包,但最新版的项目中,不用引用也可以使用。

implementation 'com.android.support:recyclerview-v7:27.1.1'

RecyclerView.Adapter

首先在界面定义一个RecyclerView。

 <LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView_frist"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true">

</androidx.recyclerview.widget.RecyclerView>

</LinearLayout>

然后定义一个RecyclerView的ItemView的模板,即每行的模板。

<?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="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto">
​ <TextView
android:id="@+id/item_tttt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text=""
android:textColor="@color/black" />

<TextView
android:id="@+id/item_bbbb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text=""
android:textColor="@color/black" />


</LinearLayout>

然后在代码中配置RecyclerView的Adapter(适配器)。

 List<Cache_User> list= new ArrayList<Cache_User>();
for(int i=0; i<10;i++){
Cache_User user=new Cache_User();
user.setName("test"+i);

list.add(user);
}
binding.recyclerViewfrist.setLayoutManager(new LinearLayoutManager(this.getContext()));//这里用线性显示 类似于listview
//binding.recyclerViewfrist.setLayoutManager(new GridLayoutManager(this, 2));//这里用线性宫格显示 类似于grid view
//binding.recyclerViewfrist.setLayoutManager(new StaggeredGridLayoutManager(2, OrientationHelper.VERTICAL));//这里用线性宫格显示 类似于瀑布流
binding.recyclerViewfrist.setAdapter(new NormalRecyclerViewAdapter(this.getContext(),list));

如上代码,首先定义一个对象的集合,然后设置RecyclerView的排列模式为线型纵向(LinearLayout默认是纵向)。

然后编写NormalRecyclerViewAdapter适配器。

首先定义适配器类继承RecyclerView.Adapter。

然后定义构造函数接受两个参数,一个是Activity的Context,一个的列表数据。

因为,列表每次滑动都刷清空数据,所以必须在适配器里把数据进行缓存。

在RecyclerView的每一行创建时,会先触发onCreateViewHolder,我们先在onCreateViewHolder里把每一行使用的模板XML设定一下,使用 LayoutInflater.from(context).inflate(R.layout.recyclerview_frist, parent, false)。然后把返回的view用NormalViewHolder封装一下,将view保存起来。(NormalViewHolder继承ViewHolder)

然后在每一行绑定数据时会触发onBindViewHolder,我们在onBindViewHolder里把他默认提供的入参ViewHolder,转换会NormalViewHolder,这样我们就可以得到这一行的view了,然后通过view.findViewById找到这一行的全部控件,在通过position参数,在数据列表entityList中定位到这一行应该绑定的数据,然后将控件进行赋值。

这样就实现了RecyclerView数据的缓存。

代码如下:

public class NormalRecyclerViewAdapter extends RecyclerView.Adapter {
private Context context;
private List<Cache_User> entityList;

public NormalRecyclerViewAdapter (Context context, List<Cache_User> entityList){
this.context = context;
this.entityList = entityList;
}

@NotNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.recyclerview_frist, parent, false);
NormalViewHolder rh = new NormalViewHolder(view);
return rh;
}

@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onBindViewHolder(@NotNull RecyclerView.ViewHolder holder, int position) {
Cache_User entity = entityList.get(position);
View view = ((NormalViewHolder)holder).itemView;
// ImageView im = (ImageView) view.findViewById(R.id.imageHeader);

TextView tv = (TextView) view.findViewById(R.id.item_tttt);
tv.setText(entity.name);
}

@Override
public int getItemCount() {
return entityList.size();
}
private class NormalViewHolder extends RecyclerView.ViewHolder {

public View itemView;
public NormalViewHolder(View _itemView) {
super(_itemView);
itemView = _itemView;
}
}
}

BaseQuickAdapter

BaseQuickAdapter比起RecyclerView.Adapter有一定的代码优化,但还是要一个列表对应一个适配器。

引用BaseQuickAdapter的包,要版本3以上。

implementation "com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.4"

RecyclerView的使用方式都一样,都是页面先使用RecyclerView,然后在代码中写RecyclerView的配置。

SFragmentAdapter adapter = new SFragmentAdapter(this.getContext(),list);
binding.recyclerViewS.setLayoutManager(new LinearLayoutManager(this.getContext()));//这里用线性显示 类似于listview
binding.recyclerViewS.setAdapter(adapter);
OnItemChildClickListener listener = (listenerAdapter, view, position) -> {
Cache_User user = list.get(position);

switch (view.getId()) {
case R.id.btnLook:
((BaseActivity)getActivity()).ShowMessage_Snackbar(root,"fdfd");
break;

}
};
adapter.addChildClickViewIds(R.id.btnLook);//为行内按钮注册点击事件
adapter.setOnItemChildClickListener(listener);//注册整个点击事件

如上代码所示,使用了BaseQuickAdapter的子类SFragmentAdapter,进行配置RecyclerView。

配置完成后,又使用BaseQuickAdapter的子类的对象实现行内按钮的点击事件。

然后编写BaseQuickAdapter的子类SFragmentAdapter。

public class SFragmentAdapter extends BaseQuickAdapter<Cache_User, BaseViewHolder> {
private Context context;

public SFragmentAdapter(@Nullable Context _context, @Nullable List<Cache_User> data) {
super(R.layout.recyclerview_surveyfragment, data);
this.context=_context;
}
@Override
protected void convert(BaseViewHolder helper, Cache_User item) {

helper.setText(R.id.name,"姓名:"+item.name);
helper.setText(R.id.loginName,"登录名:"+item.loginName);
helper.setText(R.id.realId,"真实ID:"+item.realId);
helper.setText(R.id.id,"ID:"+item.id);
}
}

如上所示,在BaseQuickAdapter的子类中,我们只需要重写一个convert方法就可以了。

BaseViewHolder提供两个参数,一个是ViewHolder,他返回的是BaseViewHolder类型的ViewHolder,一个是当前行的实体。然后什么使用BaseViewHolder提供的函数,对当前行内的控件赋值,就实现了数据缓存。

代码相对比RecyclerView.Adapter简单一点。

PS1:默认的Style设置为带的Bridge的【Theme.MaterialComponents.Light.NoActionBar.Bridge】时,按钮样式才受自定义控制。

PS2:this表示类的实例,通常Activity内部this就是Activity本身的实例,但如果是方法内部this就会表示这个方法所有类的实例,比如在Activity内部做一个Http请求,那么Http请求的回调函数中,this就是不是Activity的实例了,而如此此时需要跳转页面,而Intent的入参需要Activity,那么就需要使用Activity.this来获取实例。

<style name="Theme.Survey" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge">

----------------------------------------------------------------------------------------------------

注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!
若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!

RecyclerView使用详解的更多相关文章

  1. Android RecyclerView使用详解(三)

    在上一篇(RecyclerView使用详解(二))文章中介绍了RecyclerView的多Item布局实现,接下来要来讲讲RecyclerView的Cursor实现,相较于之前的实现,Cursor有更 ...

  2. Android RecyclerView使用详解(二)

    在上一篇(RecyclerView使用详解(一))文章中简单的介绍了RecyclerView的基本用法,接下来要来讲讲RecyclerView的更多用法,要实现不同的功能效果,大部分都还是在于Recy ...

  3. Android 高级UI设计笔记07:RecyclerView 的详解

    1. 使用RecyclerView       在 Android 应用程序中列表是一个非常重要的控件,适用场合非常多,如新闻列表.应用列表.消息列表等等,但是从Android 一出生到现在并没有非常 ...

  4. Android RecyclerView使用详解(一)

    一.前言 RecyclerView是谷歌V7包下新增的控件,用来替代ListView的使用,在RecyclerView标准化了ViewHolder类似于ListView中convertView用来做视 ...

  5. Android 高级UI设计笔记20:RecyclerView 的详解之RecyclerView添加Item点击事件

    1. 引言: RecyclerView侧重的是布局的灵活性,虽说可以替代ListView但是连基本的点击事件都没有,这篇文章就来详细讲解如何为RecyclerView的item添加点击事件,顺便复习一 ...

  6. Android 使用RecyclerView SnapHelper详解

    简介 RecyclerView在24.2.0版本中新增了SnapHelper这个辅助类,用于辅助RecyclerView在滚动结束时将Item对齐到某个位置.特别是列表横向滑动时,很多时候不会让列表滑 ...

  7. android L新控件RecyclerView详解与DeMo[转]

    http://blog.csdn.net/codebob/article/details/37813801 在谷歌的官网我们可以看到它是这样介绍的: RecyclerView  is a more a ...

  8. RecyclerView 缓存机制详解

    一 前言 RecyclerView据官方的介绍,该控件用于在有限的窗口中展示大量数据集,其实这样功能的控件我们并不陌生,例如:ListView.GridView.RecyclerView可以用来代替传 ...

  9. ANDROID L——Material Design详解(UI控件)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...

随机推荐

  1. nmap使用命令(转载)原文地址https://www.jianshu.com/p/4030c99fcaee

  2. Java中int和short的转化

    例子[1]: 第一种情况: short a = 1; a = a + 1; // 这一步会报错 System.out.print(a); 编译器会报错,原因如下: 第二种情况: short a = 1 ...

  3. P1013 [NOIP1998 提高组] 进制位

    解析 看到这道题时,有没有想到搜索?然后就是一通码......然后过了. 但是,真的要用搜索吗? 我们可以观察一下.对于n进制中的数ii,如果ii加上某一个数jj会变成两位数,那么可以得到如下不等式: ...

  4. mapper-spring-boot-starter 主要作用是

    今天是第一次接触到 这个场景启动器内心中真是一片的茫然,学习了这么长时间我居然还不知道有这个的存在今天好好查一查资料 参考资料(https://blog.csdn.net/crq1205/articl ...

  5. js原型和原型链理解 constructor 构造函数

    一.对象:普通对象   函数对象 二.构造函数特点:1.需要new实例化,内部使用this对象指向即将要生成的实例对象  2.首字母大写,用于区分普通函数 function Person(name){ ...

  6. Kafka分区策略

    Kafka分区策略 所谓分区策略是决定生产者将消息发送到哪个分区的算法.Kafka 为我们提供了默认的分区策略,同时它也支持你自定义分区策略. 常见的分区策略包含以下几种:轮询策略.随机策略 .按消息 ...

  7. iNeuOS工业互联网操作系统部署在华为欧拉(openEuler)国产系统,vmware、openEuler、postgresql、netcore、nginx、ineuos一站式部署

    目       录 1.      概述... 3 2.      创建虚拟机&安装华为欧拉(openEuler)系统... 4 2.1           创建新的虚拟机... 4 2.2  ...

  8. P2611-[ZJOI2012]小蓝的好友【Treap,扫描线】

    正题 题目链接:https://www.luogu.com.cn/problem/P2611 题目大意 \(r*c\)的网格上有\(n\)个标记点,然后求有多少个矩形包含至少一个标记点. \(1\le ...

  9. php页面 数组根据下标来排序

    $a = [ ['id'=>1,'title'=>'星期二的早晨','author'=>'张三','date'=>'2021-6-1'], ['id'=>2,'title ...

  10. Hyper-V CPU设置

    前言 最近在用Hyper-V测试项目,发现在运行过程中发现项目总数崩掉,几经发现有一个共性,CPU占用率100%,分析问题发现问题出在Hyper-V CPU设置上,Hyper-V装系统就不赘述了,网上 ...