当前位置: 首页 > news >正文

Android 设计模式之适配器模式

一、定义:

        把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

二、核心角色:

        目标接口Target:客户端期待的接口。

        被适配者Adaptee:需要被适配的类或数据源。

        适配器Adapter:将Adaptee转换成Target接口的对象。

三、简单示例:RecycleView的Adapter

1.被适配者:

// 被适配者:数据类
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; }
}
2.适配器:

// 适配器:将 List<User> 转换为 RecyclerView 所需的 Adapter 接口
public class UserAdapter extends RecyclerView.Adapter<UserAdapter.UserViewHolder> {

    private List<User> userList;

    public UserAdapter(List<User> userList) {
        this.userList = userList;
    }

    // 创建 ViewHolder
    @NonNull
    @Override
    public UserViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_user, parent, false);
        return new UserViewHolder(view);
    }

    // 绑定数据到 ViewHolder
    @Override
    public void onBindViewHolder(@NonNull UserViewHolder holder, int position) {
        User user = userList.get(position);
        holder.bind(user);
    }

    @Override
    public int getItemCount() {
        return userList.size();
    }

    // ViewHolder 内部类
    public static class UserViewHolder extends RecyclerView.ViewHolder {
        private TextView tvName;
        private TextView tvAge;

        public UserViewHolder(@NonNull View itemView) {
            super(itemView);
            tvName = itemView.findViewById(R.id.tv_name);
            tvAge = itemView.findViewById(R.id.tv_age);
        }

        public void bind(User user) {
            tvName.setText(user.getName());
            tvAge.setText("Age: " + user.getAge());
        }
    }
}

3.使用:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RecyclerView recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        // 数据源(被适配者)
        List<User> users = new ArrayList<>();
        users.add(new User("Alice", 25));
        users.add(new User("Bob", 30));

        // 设置适配器
        UserAdapter adapter = new UserAdapter(users);
        recyclerView.setAdapter(adapter);
    }
}
 

四、应用场景:

        1.列表控件数据刷新

        2.多视图类型处理

        3.第三方库兼容

五、优缺点:

优点:

        1.解耦数据与UI

        2.支持多类型试图

        3.复用现有类或第三方库

缺点:

        1.增加代码复杂度。

        2.频繁数据刷新可能会影响性能。

http://www.dtcms.com/a/99457.html

相关文章:

  • 智能路由系统-信息泄露漏洞挖掘
  • 简单使用LlamaIndex实现RAG
  • (四)GTM_TOM模块定时器中断应用
  • 基于Python深度学习的鲨鱼识别分类系统
  • 垃圾回收机制的几种实现机制简介
  • 【差分】详解一维前缀和和差分问题
  • Java高级JVM知识点记录,内存结构,垃圾回收,类文件结构,类加载器
  • 无人机进行航空数据收集对于分析道路状况非常有用-使用无人机勘测高速公路而不阻碍交通-
  • BurpSuit抓包失败-基础配置
  • 用war解压缩.7zip文件解压缩正在进行但是结束后文件消失了
  • 计算机二级考前急救(Word篇)
  • python:将mp4视频快进播放,并保存新的视频
  • OpenHarmony子系统开发 - 安全(二)
  • Redisson分布式锁深度解析:原理与实现机制
  • STM32F4单片机SDIO驱动SD卡
  • NLP语言模型训练里的特殊向量
  • Spring Boot整合Kafka详细指南(JDK 1.8)
  • Flutter环境搭建
  • JDK1.8和Maven、Git安装教程自用成功
  • 【MySQL基础】函数之字符串函数详解
  • JVM Java类加载 isInstance instanceof 的区别
  • 洛谷题单1-P5703 【深基2.例5】苹果采购-python-流程图重构
  • JDBC的详细使用
  • 【零基础入门unity游戏开发——2D篇】2D物理关节 —— Joint2D相关组件
  • [Lc4_dfs] 解数独 | 单词搜索
  • PyQt6实例_批量下载pdf工具_界面开发
  • MDK中结构体的对齐、位域、配合联合体等用法说明
  • C#:第一性原理拆解属性(property)
  • 分享一个Pyside6实现web数据展示界面的效果图
  • Springboot学习笔记3.20