Android——RecyclerView简单实现及Viewbinding优化

简介: 本文是博主对Adapter(适配器)的一些理解,为了加深对Adapter的理解以及记录自己的阶段学习而写,同时也适合初学者阅读,参考本条博客的逻辑进行学习。

本文是博主对Adapter(适配器)的一些理解,为了加深对Adapter的理解以及记录自己的阶段学习而写,同时也适合初学者阅读,参考本条博客的逻辑进行学习。


首先需要的代码如下:


111.jpeg


(1)XML主代码

首先布置主界面的布局,就一个recyclerview即可

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/recycler" />
</LinearLayout>


(2)XML布局文件

接下来设置recyclerview中每个item的布局

<?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"
    android:background="#FFFFFF"
    android:paddingTop="10dp"
    android:paddingBottom="10dp"
    android:paddingRight="20dp"
    android:paddingLeft="20dp">
    <ImageView
        android:id="@+id/imagess"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_marginRight="10dp"
        android:src="@android:mipmap/sym_def_app_icon" />
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:orientation="vertical">
        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:textColor="@color/black"
            android:textSize="16sp" />
        <TextView
            android:id="@+id/news"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="14sp"
            android:textColor="#666666" />
    </LinearLayout>
    <TextView
        android:id="@+id/time"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="end"
        android:textColor="#999999"
        android:textSize="14sp"
        android:text="2021年4月24日\n19:02:50"/>
</LinearLayout>


(3)Java内容类Message

接着就是设置每个item的内容是什么类型的,把所有内容聚集成一个对象,方便后续从对象中获取需要的内容

package com.example.recyclerview;
public class Message {
    private int imageId;
    private String name;
    private String subText;
    private String time;
    public int getImageId() {
        return imageId;
    }
    public String getName() {
        return name;
    }
    public String getTime() {
        return time;
    }
    public String getSubText() {
        return subText;
    }
    public Message(int imageId, String name, String subText,String time) {
        this.imageId = imageId;
        this.name = name;
        this.subText = subText;
        this.time=time;
    }
}


(4)Java主代码

接下来初始化控件,初始化数据,给控件设置布局,最后绑定适配器。

public class MainActivity extends AppCompatActivity{
    RecyclerView recyclerView;
    List<Message> list = new ArrayList<Message>();
    LinearLayoutManager linearLayoutManager;
    recy_Adapter recy_adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initview();
        initdata();
        settinglayout();
        binddata();
    }
    //给recycler设置一个布局
    private void settinglayout() {
        linearLayoutManager = new LinearLayoutManager
                (this, RecyclerView.VERTICAL, false);
    }
    //为控件绑定适配器
    private void binddata() {
        recy_adapter = new recy_Adapter(this, list);
        recyclerView.setAdapter(recy_adapter);
        recyclerView.setLayoutManager(linearLayoutManager);
    }
    //初始化List的数据
    private void initdata() {
        Message message1 = new Message(R.drawable.like, "喜欢"
                , "想要去北极玩", "2021年4月24日"+"\n"+"19:06:50");
        list.add(message1);
        Message message2 = new Message(R.drawable.local, "定位"
                , "想要去北极", "2021年4月24日"+"\n"+"19:06:50");
        list.add(message2);
        Message message3 = new Message(R.drawable.report, "举报"
                , "想要去北", "2021年4月24日"+"\n"+"19:06:50");
        list.add(message3);
        Message message4 = new Message(R.drawable.share, "分享"
                , "想要去", "2021年4月24日"+"\n"+"19:06:50");
        list.add(message4);
    }
    //找控件
    private void initview() {
        recyclerView = findViewById(R.id.recycler);
    }


(5)Java适配器recy_Adapter类

最后是自定义适配器一开始实现接口会爆红,把接口实现了就正常,就是以下这个图。

public class recy_Adapter extends RecyclerView.Adapter<recy_Adapter.MyAdapter> {
    @NonNull
    @Override
    public MyAdapter onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return null;
    }
    @Override
    public void onBindViewHolder(@NonNull MyAdapter holder, int position) {
    }
    @Override
    public int getItemCount() {
        return 0;
    }
    public class MyAdapter extends RecyclerView.ViewHolder{
        public MyAdapter(@NonNull View itemView) {
            super(itemView);
        }
    }
}


然后写入传统方法,已注释


    /*
    ① 创建一个继承RecyclerView.Adapter<VH>的Adapter类
    ② 创建一个继承RecyclerView.ViewHolder的静态内部类
    ③ 在Adapter中实现3个方法:
       onCreateViewHolder()
       onBindViewHolder()
       getItemCount()
    */
public class recy_Adapter extends RecyclerView.Adapter<recy_Adapter.MyAdapter>{
    Context context;
    List<Message> list=new ArrayList<Message>();
    //构造方法
    public recy_Adapter(Context context, List<Message> list) {
        this.context = context;
        this.list = list;
    }
     @Override
    //返回Item总条数
    public int getItemCount() {
        return list == null ? 0 : list.size();
    }
    @NonNull
    @Override
    //创建ViewHolder,返回每一项的布局
    public MyAdapter onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //用LayoutInflater类的方法创建一个layoutinflater对象
        LayoutInflater layoutInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        //调用inflater方法实例化recy_list的xml文件,并返回View对象还赋予一个parent父布局
        View view = layoutInflater.inflate(R.layout.recy_list, parent, false);
        //把布局中的控件利用自己创建的类给绑定起来,此时myAdapter就有了某个item里面的所有控件
        MyAdapter myAdapter = new MyAdapter(view);
        //返回对象
        return myAdapter;
    }
    @Override
    //将数据和控件绑定,获取List中对应的数据然后set到控件中(简单来说就是设置item中的控件信息)
    //第一个参数是onCreateViewHolder回调中的返回值,等于你那项item和里面的控件都获取了
    //第二个参数是每个item在List数据中的位置,从0开始数
    public void onBindViewHolder(@NonNull MyAdapter holder, int position) {
        //获取List列表中对应位置的Message的对象
        Message message = list.get(position);
        //从对象中取出对应的字段数据
        holder.image.setImageResource(message.getImageId());
        holder.name.setText(message.getName());
        holder.subtext.setText(message.getSubText());
        holder.time.setText(message.getTime());
    }
    //内部类,绑定控件
    public class MyAdapter extends RecyclerView.ViewHolder{
        //布局有什么控件就写定义什么
        TextView name,subtext,time;
        ImageView image;
        //找item里的控件
        public MyAdapter(@NonNull View itemView) {
            super(itemView);
            image = itemView.findViewById(R.id.imagess);
            name = itemView.findViewById(R.id.name);
            subtext = itemView.findViewById(R.id.news);
            time = itemView.findViewById(R.id.time);
        }
}


ViewBinding优化后的Adapter


public class recy_Adapter extends RecyclerView.Adapter<recy_Adapter .MyAdapter> {
    private final Context context;
    private final List<Message> list;
    public recy_Adapter (Context context, List<Message> list) {
        this.context= context;
        this.list= list;
    }
    @Override
    public int getItemCount() {
        return  list == null ? 0 : list.size();
    }
    @NonNull
    @Override
    public MyAdapter onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        ItemListBinding it=ItemListBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false))
        return new MyAdapter(it);
    }
    @Override
    public void onBindViewHolder(@NonNull MyAdapter holder, int position) {
        Message message = list.get(position);
        holder.mView.image.setImageResource(message .getImageId());
        holder.mView.name.setText(message .getName());
        holder.mView.subtext.setText(message .getSubText());
        holder.mView.time.setText(message .getTime());
    }
    static class MyAdapter extends RecyclerView.ViewHolder {
        ItemListBinding mView;
        public MyAdapter (ItemListBinding itemView) {
            super(itemView.getRoot());
            this.mView = itemView;
        }
    }
}


通俗的说,inflate就相当于将一个xml中定义的布局找出来。


因为在一个Activity里如果直接用findViewById()的话,找的是setConentView()的那个layout布局里的组件。


因此如果你的Activity里如果用到别的layout,比如对话框上的layout布局,你还要设置对话框上的layout布局里的组件像ImageView,TextView上的内容,你就必须用inflate()先将对话框上的layout布局找出来,然后再用这个layout布局对象去找到它上面的组件,如:


从一个Context中,获得一个布局填充器,这样你就可以使用这个填充器来把xml布局文件转为View对象了。


//加载整个应用的布局管理器
LayoutInflater layoutInflater= LayoutInflater.from(context);
//利用布局管理器,将xml布局转换为view对象
convertView = layoutInflater.inflate(R.layout.item_myseallist,parent, false);
//利用view对象,找到xml布局中的组件
convertView.findViewById(R.id.delete);


(6)效果图

上面已经注释的挺简单了,后面我觉得不好再修改,下面就是写完后的效果,但是还没有设置点击事件,后面我写完的时候再更新一下博客。

222.png

目录
相关文章
|
12天前
|
存储 消息中间件 人工智能
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
77 10
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
|
6月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
1312 77
|
4月前
|
缓存 编解码 Android开发
Android内存优化之图片优化
本文主要探讨Android开发中的图片优化问题,包括图片优化的重要性、OOM错误的成因及解决方法、Android支持的图片格式及其特点。同时介绍了图片储存优化的三种方式:尺寸优化、质量压缩和内存重用,并详细讲解了相关的实现方法与属性。此外,还分析了图片加载优化策略,如异步加载、缓存机制、懒加载等,并结合多级缓存流程提升性能。最后对比了几大主流图片加载框架(Universal ImageLoader、Picasso、Glide、Fresco)的特点与适用场景,重点推荐Fresco在处理大图、动图时的优异表现。这些内容为开发者提供了全面的图片优化解决方案。
176 1
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
168 20
Android经典面试题之图片Bitmap怎么做优化
|
11月前
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
186 4
|
Android开发 开发者 索引
Android实战经验之如何使用DiffUtil提升RecyclerView的刷新性能
本文介绍如何使用 `DiffUtil` 实现 `RecyclerView` 数据集的高效更新,避免不必要的全局刷新,尤其适用于处理大量数据场景。通过定义 `DiffUtil.Callback`、计算差异并应用到适配器,可以显著提升性能。同时,文章还列举了常见错误及原因,帮助开发者避免陷阱。
914 9
|
存储 缓存 Android开发
Android RecyclerView 缓存机制深度解析与面试题
本文首发于公众号“AntDream”,详细解析了 `RecyclerView` 的缓存机制,包括多级缓存的原理与流程,并提供了常见面试题及答案。通过本文,你将深入了解 `RecyclerView` 的高性能秘诀,提升列表和网格的开发技能。
219 8
|
10月前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。
|
Java Android开发 开发者
安卓应用开发中的线程管理优化技巧
【9月更文挑战第10天】在安卓开发的海洋里,线程管理犹如航行的风帆,掌握好它,能让应用乘风破浪,反之则可能遭遇性能的暗礁。本文将通过浅显易懂的语言和生动的比喻,带你探索如何优雅地处理安卓中的线程问题,从基础的线程创建到高级的线程池运用,让你的应用运行更加流畅。
|
Java Android开发 UED
安卓应用开发中的内存管理优化技巧
在安卓开发的广阔天地里,内存管理是一块让开发者既爱又恨的领域。它如同一位严苛的考官,时刻考验着开发者的智慧与耐心。然而,只要我们掌握了正确的优化技巧,就能够驯服这位考官,让我们的应用在性能和用户体验上更上一层楼。本文将带你走进内存管理的迷宫,用通俗易懂的语言解读那些看似复杂的优化策略,让你的开发之路更加顺畅。
249 2

热门文章

最新文章