博客
关于我
MyAdapter代码复用工具类
阅读量:796 次
发布时间:2023-02-09

本文共 5468 字,大约阅读时间需要 18 分钟。

CommonBaseAdapter和CommonViewHolder的实现详解

作为Android开发者,常常需要处理列表或RecyclerView中的数据展示问题。为了提高开发效率,很多开发者会创建通用适配器来统一处理数据展示逻辑。今天,我们将学习一个高效的适配器实现方案——CommonBaseAdapter和CommonViewHolder。

CommonBaseAdapter类

CommonBaseAdapter是一个抽象类,主要用于处理通用数据适配。它继承自BaseAdapter,提供了基本的数据获取接口。

package com.example.commonAdapter;
import java.util.List;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
public abstract class CommonBaseAdapter
extends BaseAdapter {
protected List
datas;
protected Context context;
protected int resourceId;
public CommonBaseAdapter(Context context, List
datas, int resourceId) {
this.datas = datas;
this.context = context;
this.resourceId = resourceId;
}
@Override
public int getCount() {
return datas.size();
}
@Override
public T getItem(int position) {
return datas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
CommonViewHolder viewHolder = CommonViewHolder.getInstance(context, convertView, parent, resourceId);
publishView(viewHolder, getItem(position));
return viewHolder.getConvertView();
}
public abstract void publishView(CommonViewHolder viewHolder, T t);
}

CommonViewHolder类

CommonViewHolder是CommonBaseAdapter的配套 ViewHolder类,负责将数据绑定到视图上。

package com.example.commonAdapter;
import android.content.Context;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class CommonViewHolder {
private View convertView;
private SparseArray
views;
public CommonViewHolder(Context context, ViewGroup parent, int resource) {
this.views = new SparseArray
();
this.convertView = LayoutInflater.from(context).inflate(resource, parent, false);
this.convertView.setTag(this);
}
public static CommonViewHolder getInstance(Context context, View convertView, ViewGroup parent, int resource) {
if (convertView == null) {
return new CommonViewHolder(context, parent, resource);
} else {
return (CommonViewHolder) convertView.getTag();
}
}
public View getConvertView() {
return convertView;
}
public View getView(int id) {
View view = views.get(id);
if (view == null) {
view = convertView.findViewById(id);
views.put(id, view);
}
return (T) view;
}
public CommonViewHolder setText(int id, CharSequence text) {
TextView textView = getView(id);
textView.setText(text);
return this;
}
}

使用示例

以下是一个使用示例,展示如何在主Activity中使用这些适配器。

package com.example.commonAdapter;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
public class MainActivity extends Activity {
private List
datas;
private MyAdapter adapter;
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listView);
initDatas();
adapter = new MyAdapter(this, datas, R.layout.item);
listView.setAdapter(adapter);
}
private void initDatas() {
datas = new ArrayList<>();
for (int i = 0; i < 30; i++) {
User user = new User("name" + i, false);
datas.add(user);
}
}
}

MyAdapter类

MyAdapter继承自CommonBaseAdapter,具体实现数据展示逻辑。

package com.example.commonAdapter;
import java.util.List;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.TextView;
public class MyAdapter extends CommonBaseAdapter
{
public MyAdapter(Context context, List
datas, int resourceId) {
super(context, datas, resourceId);
}
@Override
public void publishView(CommonViewHolder viewHolder, final User user) {
viewHolder.setText(R.id.name, user.getName());
CheckBox box = viewHolder.getView(R.id.cb);
box.setChecked(user.isChecked());
box.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
boolean checked = !user.isChecked();
user.setChecked(checked);
}
});
}
}

User类

User类用于存储用户数据,包含姓名和是否选中状态。

package com.example.commonAdapter;
public class User {
private String name;
private boolean isChecked;
public User(String name, boolean isChecked) {
this.name = name;
this.isChecked = isChecked;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isChecked() {
return isChecked;
}
public void setChecked(boolean checked) {
this.isChecked = checked;
}
}

总结

通过CommonBaseAdapter和CommonViewHolder,我们可以快速实现通用数据适配,简化ViewHolder的创建和管理流程。在实际开发中,可以根据具体需求扩展这些类,添加更多的数据处理逻辑和视图绑定功能。希望这个实现方案能为你的Android开发提供帮助!

转载地址:http://offfk.baihongyu.com/

你可能感兴趣的文章
MacOS:创建目录出现 Read-only file system
查看>>
macOS使用django安装mysqlclient遇到的问题(mysqlclient 1.3.3 or newer is required)
查看>>
macOS系统上安装JDK
查看>>
MacType Decency 项目常见问题解决方案
查看>>
Mac下IDEA更换Maven仓库
查看>>
Mac下MySQL 报错:Error1045(28000)解决办法
查看>>
Mac下redis安装和启动
查看>>
Mac下如何配置环境变量
查看>>
Mac下安装jdk
查看>>
Mac下安装PEAR
查看>>
mac下安装配置nginx
查看>>
Mac下忘记MySQL密码可以这样做!
查看>>
Mac下配置多个SSH-Key (gitLab)
查看>>
mac地址随机变化的解决方法(安卓手机通用)不用ROOT
查看>>
Mac安装Maven
查看>>
Mac实现远程服务器登录管理
查看>>
mac常用命令
查看>>
mac更新后 homestead 无法使用
查看>>
mac环境安装docker
查看>>
MAC生成公钥私钥、PKCS1 转 PKCS8
查看>>