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

目录
相关文章
|
6月前
|
移动开发 监控 前端开发
构建高效Android应用:从优化布局到提升性能
【7月更文挑战第60天】在移动开发领域,一个流畅且响应迅速的应用程序是用户留存的关键。针对Android平台,开发者面临的挑战包括多样化的设备兼容性和性能优化。本文将深入探讨如何通过改进布局设计、内存管理和多线程处理来构建高效的Android应用。我们将剖析布局优化的细节,并讨论最新的Android性能提升策略,以帮助开发者创建更快速、更流畅的用户体验。
89 10
|
5月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
92 20
Android经典面试题之图片Bitmap怎么做优化
|
4月前
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
92 4
|
3月前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。
|
5月前
|
Android开发 开发者 索引
Android实战经验之如何使用DiffUtil提升RecyclerView的刷新性能
本文介绍如何使用 `DiffUtil` 实现 `RecyclerView` 数据集的高效更新,避免不必要的全局刷新,尤其适用于处理大量数据场景。通过定义 `DiffUtil.Callback`、计算差异并应用到适配器,可以显著提升性能。同时,文章还列举了常见错误及原因,帮助开发者避免陷阱。
420 9
|
5月前
|
存储 缓存 Android开发
Android RecyclerView 缓存机制深度解析与面试题
本文首发于公众号“AntDream”,详细解析了 `RecyclerView` 的缓存机制,包括多级缓存的原理与流程,并提供了常见面试题及答案。通过本文,你将深入了解 `RecyclerView` 的高性能秘诀,提升列表和网格的开发技能。
99 8
|
5月前
|
Java Android开发 开发者
安卓应用开发中的线程管理优化技巧
【9月更文挑战第10天】在安卓开发的海洋里,线程管理犹如航行的风帆,掌握好它,能让应用乘风破浪,反之则可能遭遇性能的暗礁。本文将通过浅显易懂的语言和生动的比喻,带你探索如何优雅地处理安卓中的线程问题,从基础的线程创建到高级的线程池运用,让你的应用运行更加流畅。
|
5月前
|
Java Android开发 UED
安卓应用开发中的内存管理优化技巧
在安卓开发的广阔天地里,内存管理是一块让开发者既爱又恨的领域。它如同一位严苛的考官,时刻考验着开发者的智慧与耐心。然而,只要我们掌握了正确的优化技巧,就能够驯服这位考官,让我们的应用在性能和用户体验上更上一层楼。本文将带你走进内存管理的迷宫,用通俗易懂的语言解读那些看似复杂的优化策略,让你的开发之路更加顺畅。
99 2
|
5月前
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
116 0
|
5月前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
199 0

热门文章

最新文章

  • 1
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
  • 2
    Android历史版本与APK文件结构
  • 3
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 4
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 5
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
  • 6
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 7
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 8
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
  • 9
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 10
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡