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.频繁数据刷新可能会影响性能。

相关推荐
hashiqimiya14 分钟前
每日android布局xml文件
android·xml·gitee
我爱cope20 分钟前
【Agent智能体23 | 规划-规划工作流】
人工智能·设计模式·语言模型·职场和发展
m0_738120721 小时前
渗透测试基础——PHP 序列化数据结构与反序列化机制详解
android·服务器·网络·数据结构·安全·php
lengjingzju1 小时前
符·形·音·意(SFEM):一种面向通用智能的四维认知架构
设计模式·ai·学习方法
故渊at1 小时前
第二板块:Android 四大组件标准化学理 | 第十一篇:组件间通信(IPC)与 Binder 深度解析
android·binder·组件化·组件间通信
ZC跨境爬虫1 小时前
跟着 MDN 学JavaScript day_10:数组——数据的有序集合
android·java·开发语言·前端·javascript
消失的旧时光-19432 小时前
Kotlin 协程设计思想(九):Flow 到底是什么?为什么 suspend 函数还需要 Flow?
android·kotlin·协程·协程异常
消失的旧时光-19432 小时前
Kotlin 协程设计思想(八):suspend 到底是什么?为什么 suspend 不是开启协程?
android·kotlin·suspend·continuation
weiggle2 小时前
第六篇:状态管理——从 mutableStateOf 到 StateFlow
android