本文共 5468 字,大约阅读时间需要 18 分钟。
CommonBaseAdapter和CommonViewHolder的实现详解
作为Android开发者,常常需要处理列表或RecyclerView中的数据展示问题。为了提高开发效率,很多开发者会创建通用适配器来统一处理数据展示逻辑。今天,我们将学习一个高效的适配器实现方案——CommonBaseAdapter和CommonViewHolder。
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 CommonBaseAdapterextends 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是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 SparseArrayviews; 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 Listdatas; 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继承自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类用于存储用户数据,包含姓名和是否选中状态。
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/