Android设计模式之适配器模式(Adapter)与使用场景
·
在Android开发中,适配器模式(Adapter Pattern)是一种极为常用的设计模式,它的主要功能是让原本因为接口不兼容而无法一起工作的类能够协同运作。下面详细介绍适配器模式在Android中的实现、使用场景以及相关示例。
适配器模式的概念与类型
适配器模式主要有两种类型,分别是类适配器模式和对象适配器模式。
- 类适配器模式:这种模式通过多重继承来同时适配多个接口。不过由于Java不支持多重继承,所以在Android开发中,类适配器模式并不常用。
- 对象适配器模式:此模式通过组合的方式来实现适配功能,即持有一个被适配对象的引用。在Android开发中,我们主要使用的就是对象适配器模式。
适配器模式在Android中的典型应用场景
适配器模式在Android SDK中应用广泛,以下是几个典型的应用场景:
1. AdapterView与Adapter的协作
在Android中,ListView、GridView、Spinner等AdapterView控件需要借助Adapter来展示数据。Adapter的作用是将数据(如List、Cursor等)转换为View,以适配AdapterView的接口。
下面是一个简单的示例代码:
// 数据类
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;
}
}
// 自定义适配器
public class UserAdapter extends ArrayAdapter<User> {
private Context context;
private int resource;
public UserAdapter(Context context, int resource, List<User> users) {
super(context, resource, users);
this.context = context;
this.resource = resource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(resource, parent, false);
holder = new ViewHolder();
holder.nameTextView = convertView.findViewById(R.id.nameTextView);
holder.ageTextView = convertView.findViewById(R.id.ageTextView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
User user = getItem(position);
if (user != null) {
holder.nameTextView.setText(user.getName());
holder.ageTextView.setText(String.valueOf(user.getAge()));
}
return convertView;
}
private static class ViewHolder {
TextView nameTextView;
TextView ageTextView;
}
}
// 在Activity中使用适配器
public class MainActivity extends AppCompatActivity {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.listView);
// 准备数据
List<User> userList = new ArrayList<>();
userList.add(new User("张三", 25));
userList.add(new User("李四", 30));
userList.add(new User("王五", 22));
// 设置适配器
UserAdapter adapter = new UserAdapter(this, R.layout.list_item_user, userList);
listView.setAdapter(adapter);
}
}
2. RecyclerView与Adapter的配合
RecyclerView是ListView的升级版,它同样需要Adapter来连接数据和ViewHolder。
示例代码如下:
// 数据类
public class Item {
private String title;
private String description;
public Item(String title, String description) {
this.title = title;
this.description = description;
}
public String getTitle() {
return title;
}
public String getDescription() {
return description;
}
}
// ViewHolder类
public class ItemViewHolder extends RecyclerView.ViewHolder {
public TextView titleTextView;
public TextView descriptionTextView;
public ItemViewHolder(View itemView) {
super(itemView);
titleTextView = itemView.findViewById(R.id.titleTextView);
descriptionTextView = itemView.findViewById(R.id.descriptionTextView);
}
}
// 适配器类
public class ItemAdapter extends RecyclerView.Adapter<ItemViewHolder> {
private List<Item> itemList;
public ItemAdapter(List<Item> itemList) {
this.itemList = itemList;
}
@Override
public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_layout, parent, false);
return new ItemViewHolder(view);
}
@Override
public void onBindViewHolder(ItemViewHolder holder, int position) {
Item item = itemList.get(position);
holder.titleTextView.setText(item.getTitle());
holder.descriptionTextView.setText(item.getDescription());
}
@Override
public int getItemCount() {
return itemList.size();
}
}
// 在Activity中使用RecyclerView
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private ItemAdapter adapter;
private List<Item> itemList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
itemList = new ArrayList<>();
itemList.add(new Item("标题1", "描述1"));
itemList.add(new Item("标题2", "描述2"));
itemList.add(new Item("标题3", "描述3"));
adapter = new ItemAdapter(itemList);
recyclerView.setAdapter(adapter);
}
}
3. 数据格式的转换适配
在实际开发中,我们经常需要将不同来源的数据(如JSON、XML等)转换为应用内部使用的对象模型,这时就可以使用适配器模式。
下面是一个数据格式转换的示例:
// 原始数据类
public class JsonData {
private String jsonName;
private int jsonAge;
public JsonData(String jsonName, int jsonAge) {
this.jsonName = jsonName;
this.jsonAge = jsonAge;
}
public String getJsonName() {
return jsonName;
}
public int getJsonAge() {
return jsonAge;
}
}
// 目标数据类
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;
}
}
// 适配器类
public class UserAdapter {
public static User convertFromJson(JsonData jsonData) {
return new User(jsonData.getJsonName(), jsonData.getJsonAge());
}
}
// 使用适配器
public class Main {
public static void main(String[] args) {
// 假设有一个JSON数据对象
JsonData jsonData = new JsonData("张三", 25);
// 通过适配器转换为User对象
User user = UserAdapter.convertFromJson(jsonData);
System.out.println("姓名: " + user.getName());
System.out.println("年龄: " + user.getAge());
}
}
适配器模式的优点
- 解耦功能:适配器模式能够将客户端和目标接口分离开来,客户端只需通过适配器就可以调用目标接口,而不需要直接与具体的实现类进行交互。
- 增强扩展性:当需要对功能进行扩展时,我们可以通过创建新的适配器类来实现,而不用修改原有的代码,符合开闭原则。
- 提高复用性:适配器可以复用已有的类,即使这些类的接口与我们的需求不兼容,通过适配器也能让它们为我们所用。
总结
适配器模式在Android开发中扮演着重要的角色,特别是在数据展示和格式转换方面。在ListView、RecyclerView等组件中,适配器模式是核心实现机制之一。通过合理运用适配器模式,我们能够让代码更加灵活、可维护,同时提高代码的复用性。
更多推荐
所有评论(0)