23种设计模式——适配器模式(Adapter)详解

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。
🍎个人主页:Meteors.的博客
💞当前专栏: 设计模式
✨特色专栏: 知识分享
🥭本文内容: 23种设计模式------适配器模式(Adapter) 详解
📚 ** ps ** : 阅读文章如果有问题或者疑惑,欢迎在评论区提问或指出。


目录

一、背景

[二、 数据模型(被适配的对象)](#二、 数据模型(被适配的对象))

三、适配器实现(核心适配逻辑)

四、使用适配器(Activity代码)

五、适配器模式对应关系


一、背景

你现在可能对于它有些陌生,但是原生安卓app的列表大部分是使用它来实现的!android项目中有太多地方使用过它了(如下图)。正是有了它,才让数据与图片可以在列表中显示。下面,让我们一起揭开它的神秘面纱吧!


二、 数据模型(被适配的对象)

复制代码
public class User {
    private String name;  // 用户名
    private int age;      // 用户年龄
    
    // 构造函数
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    // 获取用户名
    public String getName() { return name; }
    
    // 获取用户年龄
    public int getAge() { return age; }
}

这段代码定义了一个简单的User类,包含用户名和年龄两个属性。这个类就是列表中每一列需要显示的数据。


三、适配器实现(核心适配逻辑)

复制代码
public class UserAdapter extends RecyclerView.Adapter<UserAdapter.UserViewHolder> {
    private List<User> users;  // 存储用户数据列表
    
    // 构造函数,接收数据列表
    public UserAdapter(List<User> users) {
        this.users = users;
    }
    
    // 定义ViewHolder,用于缓存视图元素
    public static class UserViewHolder extends RecyclerView.ViewHolder {
        TextView nameView;  // 显示姓名的TextView
        TextView ageView;   // 显示年龄的TextView
        
        public UserViewHolder(View itemView) {
            super(itemView);
            // 从布局文件中查找对应的视图组件
            nameView = itemView.findViewById(R.id.tv_name);
            ageView = itemView.findViewById(R.id.tv_age);
        }
    }
    
    // 创建新视图时调用
    @Override
    public UserViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // 加载列表项的布局文件
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_user, parent, false);
        return new UserViewHolder(view);
    }
    
    // 将数据绑定到视图上
    @Override
    public void onBindViewHolder(UserViewHolder holder, int position) {
        User user = users.get(position);  // 获取当前位置的数据
        holder.nameView.setText(user.getName());     // 设置姓名
        holder.ageView.setText(String.valueOf(user.getAge()));  // 设置年龄
    }
    
    // 返回数据总数
    @Override
    public int getItemCount() {
        return users.size();
    }
}

这段代码是适配器的核心实现:

  1. 继承RecyclerView.Adapter并指定ViewHolder类型

  2. 在构造函数中接收要显示的数据列表

  3. 实现三个必要方法:创建视图、绑定数据、返回数据量


四、使用适配器(Activity代码)

复制代码
// 准备测试数据
List<User> userList = new ArrayList<>();
userList.add(new User("张三", 25));
userList.add(new User("李四", 30));

// 获取RecyclerView控件
RecyclerView recyclerView = findViewById(R.id.recyclerView);

// 设置布局管理器(决定列表如何排列)
recyclerView.setLayoutManager(new LinearLayoutManager(this));

// 创建并设置适配器
recyclerView.setAdapter(new UserAdapter(userList));

其实就是页面代码,里面使用了我明定义的列表。这段代码说了适配器的使用:

  1. 准备要显示的数据

  2. 获取列表控件

  3. 设置列表布局方式

  4. 创建适配器并绑定数据


五、适配器模式对应关系

  • ​Target接口​ ​:RecyclerView.Adapter定义的接口(onCreateViewHolder等方法)

  • ​Adaptee​ ​:List<User>数据列表(原始数据格式)

  • ​Adapter​ ​:UserAdapter类(将数据适配为视图)

  • ​Client​ ​:使用RecyclerView的代码(通过适配器间接使用数据)

这个例子展示了适配器模式如何将数据列表(List<User>)转换为可以在屏幕上显示的列表项视图。


最后,

其它设计模式会陆续更新,希望文章对你有所帮助!

相关推荐
StevenLdh17 分钟前
第四期 · 云端同步与冲突仲裁:离线可写、多端一致的工程解法
java·微信小程序
事已至此先睡覺吧28 分钟前
第三篇:Java 流程控制详解:条件判断、循环与跳转语句
java·开发语言
毕业设计70329 分钟前
(免费领源码) SpringBoot 游戏交易平台17600-java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
java·spring boot·mysql·决策树·mybatis·idea·推荐算法
一 乐36 分钟前
自习室座位预约管理系统|基于springboot + vue自习室座位预约管理系统(源码+数据库+文档)
java·vue.js·spring boot
此时不提桶,更待何时1 小时前
02-02-B-AQS与JUC锁面试与生产事故实战
java
音符犹如代码1 小时前
Kafka 接入 AI 的三条路线:MCP 提案、会话记忆与实时上下文
java·大数据·ai·kafka
vx_BS813301 小时前
【项目编号:project51629】Spring Boot 乡村自来水缴费系统:把抄表、水费生成与在线缴费做成一条数字化闭环
java·spring boot·eclipse·tomcat·maven
qq_269506751 小时前
第29课-Servlet基础
java
毅炼1 小时前
不写多语言 SDK,怎么让 Python、Go、Node 服务接入注册中心?
java·后端·系统架构·gateway
2501_937860941 小时前
上篇:网络编程基础与UDP套接字编程
java·网络·计算机网络