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

目录
相关文章
|
3天前
|
Java 数据库 Android开发
【专栏】构建高效 Android 应用:探究 Kotlin 多线程优化策略
【4月更文挑战第27天】本文探讨了Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理。通过案例分析展示了网络请求、图像处理和数据库操作的优化实践。同时,文章指出并发编程的挑战,如性能评估、调试及兼容性问题,并强调了多线程优化对提升应用性能的重要性。开发者应持续学习和探索新的优化策略,以适应移动应用市场的竞争需求。
|
7天前
|
缓存 监控 Android开发
构建高效Android应用:从优化用户体验到提升性能表现
【4月更文挑战第23天】 在竞争激烈的移动市场中,一个高效的Android应用是吸引并保留用户的关键。本文将探讨如何通过一系列技术手段和最佳实践来优化Android应用的用户体验和性能表现。我们将深入分析响应式UI设计、内存管理、多线程处理以及最新的Android框架特性,揭示它们如何共同作用以减少应用延迟,提高响应速度,并最终提升整体用户满意度。
|
9天前
|
缓存 API Android开发
Android 应用优化策略:提升性能与用户体验
【4月更文挑战第21天】在移动应用开发领域,性能优化是一个持续的挑战。尤其对于Android平台,由于设备多样性和系统版本的碎片化,开发者需要采取多种策略确保应用流畅运行并给用户带来良好体验。本文将深入探讨针对Android应用的性能优化技巧,包括内存管理、UI渲染效率提升、多线程应用以及电池寿命优化等方面。这些建议旨在帮助开发者诊断和改进现有应用,或在开发新项目时提前考虑到性能因素。
|
10天前
|
API 数据库 Android开发
构建高效Android应用:探究Kotlin协程的优化实践
【4月更文挑战第20天】 在现代Android开发中,Kotlin协程以其轻量级线程管理和非阻塞I/O操作的优势成为提升应用性能和响应性的重要工具。本文深入分析Kotlin协程的核心原理,探讨其在Android平台上实现高效并发编程的方法,并通过具体实例演示如何利用协程改进应用架构。我们将从协程的基本概念出发,逐步解析其与线程、回调和异步任务的关系,最终展示如何通过协程简化代码结构,提高运行效率,并确保用户界面的流畅性。
21 11
|
22天前
|
缓存 测试技术 Android开发
深入探究Android中的自定义View绘制优化策略
【4月更文挑战第8天】 在Android开发实践中,自定义View的绘制性能至关重要,尤其是当涉及到复杂图形和动画时。本文将探讨几种提高自定义View绘制效率的策略,包括合理使用硬件加速、减少不必要的绘制区域以及利用缓存机制等。这些方法不仅能改善用户体验,还能提升应用的整体性能表现。通过实例分析和性能测试结果,我们将展示如何有效地实现这些优化措施,并为开发者提供实用的技术指南。
|
1天前
|
移动开发 数据库 Android开发
构建高效Android应用:探究Kotlin协程的优化实践
【4月更文挑战第29天】在移动开发领域,尤其是Android平台上,性能优化一直是开发者关注的重点。近年来,Kotlin语言凭借其简洁性和功能性成为Android开发的热门选择。其中,Kotlin协程作为一种轻量级的并发处理机制,为编写异步代码、网络请求和数据库操作提供了极大的便利。本文将深入探讨Kotlin协程在Android应用中的性能优化技巧,帮助开发者构建更加高效的应用程序。
|
2天前
|
移动开发 API Android开发
Android应用性能优化实战
【4月更文挑战第28天】在移动开发领域,一个流畅的用户体验是至关重要的。对于Android开发者而言,应用的性能优化是一项既挑战性也极其重要的工作。本文将深入探讨Android应用性能优化的多个方面,包括内存管理、UI渲染、多线程处理以及电池效率等,旨在为开发者提供实用的性能提升策略和具体的实施步骤。通过分析常见的性能瓶颈,并结合最新的Android系统特性和工具,我们的目标是帮助读者打造更加高效、响应迅速的Android应用。
|
3天前
|
缓存 监控 Android开发
Android 应用性能优化实战
【4月更文挑战第27天】 在竞争激烈的移动应用市场中,性能优越的应用更能吸引和保留用户。针对Android平台,本文将深入探讨影响应用性能的关键因素,并提供一系列实用的优化策略。我们将从内存管理、UI渲染、多线程处理以及电池使用效率等方面入手,通过具体案例分析如何诊断常见问题,并给出相应的解决方案。文中所提技巧旨在帮助开发者构建更加流畅、高效的Android应用。
16 2
|
6天前
|
移动开发 Java Android开发
构建高效Android应用:采用Kotlin协程优化网络请求
【4月更文挑战第24天】 在移动开发领域,尤其是对于Android平台而言,网络请求是一个不可或缺的功能。然而,随着用户对应用响应速度和稳定性要求的不断提高,传统的异步处理方式如回调地狱和RxJava已逐渐显示出局限性。本文将探讨如何利用Kotlin协程来简化异步代码,提升网络请求的效率和可读性。我们将深入分析协程的原理,并通过一个实际案例展示如何在Android应用中集成和优化网络请求。
|
8天前
|
Java 数据库 Android开发
构建高效Android应用:探究Kotlin协程的优化实践
【4月更文挑战第22天】 随着移动开发技术的不断进步,Android平台上的性能优化已成为开发者们关注的焦点。在众多优化手段中,Kotlin协程以其轻量级线程管理和异步编程的优势,为提高应用性能和响应性提供了新的思路。本文将深入探讨Kotlin协程在Android开发中的具体应用,通过实例演示如何利用协程进行网络请求、数据库操作和UI线程的非阻塞更新,以期达到提升应用性能的目的。
12 2