Android之Adapter的封装与抽象
在开发的过程中,常常会用到ViewPager、ListView、GridView等、这些带有Item的视图控件,而这些控件有个共同点就是都要用到它们的适配器,我们在实现视图展示时,一般都会去写个自定义的适配器去继承PagerAdapter或Adapter或Adapter的子类,因为Android源码自带的这些适配器都比较抽象,往往在我们开发时,写的一些自定义适配器都需要重写Adapter父类的一些方法,在重写时,有很多较通用性的代码,比较耦合,下面将PagerAdapter和Adapter的子类BaseAdapter进行了封装与抽象,免去了每次都去重写这些通用的代码,代码如下:
1.ViewPagerAdapter
/** * 通用ViewPagerAdapter * @author Jenly * */ public class ViewPagerAdapter extends PagerAdapter { private List<View> listViews = null; public ViewPagerAdapter(List<View> listViews) { this.listViews = listViews; } @Override public void destroyItem(View container, int position, Object object) { ((ViewPager)container).removeView(listViews.get(position)); } @Override public int getCount() { return listViews.size(); } @Override public Object instantiateItem(View container, int position) { ((ViewPager)container).addView(listViews.get(position),0); return listViews.get(position); } @Override public boolean isViewFromObject(View paramView, Object paramObject) { return paramView == paramObject; } public List<View> getListViews() { return listViews; } public void setListViews(List<View> listViews) { this.listViews = listViews; } }因为ViewPager的Item基本上都是继承View,所以这个ViewPagerAdapter 基本上可作为ViewPager控件的通用适配器。
2.AbstractAdapter
/** * 抽象适配器(免去一些通用的代码) * @author Jenly * * @param <T> */ public abstract class AbstractAdapter<T> extends BaseAdapter{ protected Context context; protected List<T> listData; protected LayoutInflater layoutInflater; public AbstractAdapter(Context context,List<T> listData){ this.context = context; this.listData = listData; layoutInflater = LayoutInflater.from(context); } @Override public int getCount() { return listData==null ? 0:listData.size(); } @Override public Object getItem(int position) { return listData==null ? null:listData.get(position); } @Override public long getItemId(int position) { return position; } public List<T> getListData() { return listData; } public void setListData(List<T> listData) { this.listData = listData; } public View inflate(int layoutId){ return layoutInflater.inflate(layoutId, null); } }
AbstractAdapter<T> 将父类比较有共性的方法重写,自定义适配器时,只要继承AbstractAdapter<T>,重写getView方法就可以了。
3.HolderAdapter
/** * 通用适配器(适合一些常规的适配器) * @author Jenly * * @param <T> */ public abstract class HolderAdapter<T> extends AbstractAdapter<T>{ public HolderAdapter(Context context, List<T> listData) { super(context, listData); } @Override public View getView(int position, View convertView, ViewGroup parent) { Object holder = null; if(convertView==null){ convertView = buildConvertView(layoutInflater); holder = buildHolder(convertView); convertView.setTag(holder); }else{ holder = convertView.getTag(); } bindViewData(holder,listData.get(position),position); return convertView; } /** * 建立convertView * @param layoutInflater * @return */ public abstract View buildConvertView(LayoutInflater layoutInflater); /** * 建立视图Holder * @param convertView * @return */ public abstract Object buildHolder(View convertView); /** * 绑定数据 * @param holder * @param t * @param position */ public abstract void bindViewData(Object holder,T t,int position); }
HolderAdapter 继承于上面的AbstractAdapter类,将getView方法进行重写与抽象,使代码更加简洁,用起来更加简单,只要是继承于BaseAdapter的自定义适配器类,改为继承于HolderAdapter 基本上通用,然后只需实现BuildConvertView、buildHolder、bindViewDatas这三个方法。
下面是个自定义的测试适配器,继承HolderAdapter实现它的三个抽象方法:
/** * 通用适配器(适合一些常规的适配器) * @author Jenly * * @param <T,H> T:实体对象,H:ViewHolder */ public abstract class HolderAdapter<T,H> extends AbstractAdapter<T>{ public HolderAdapter(Context context, List<T> listData) { super(context, listData); } @Override public View getView(int position, View convertView, ViewGroup parent) { H holder = null; if(convertView==null){ convertView = buildConvertView(layoutInflater); holder = buildHolder(convertView); convertView.setTag(holder); }else{ holder = (H)convertView.getTag(); } bindViewDatas(holder,listData.get(position),position); return convertView; } /** * 建立convertView * @param layoutInflater * @return */ public abstract View buildConvertView(LayoutInflater layoutInflater); /** * 建立视图Holder * @param convertView * @return */ public abstract H buildHolder(View convertView); /** * 绑定数据 * @param holder * @param t * @param position */ public abstract void bindViewDatas(H holder,T t,int position); }
关于作者
Name: Jenly
Email: jenly1314@gmail.com
Email: jenly1314@vip.qq.com
Github: github.com/jenly1314
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架