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() {
		if(listData!=null){
			return listData.size();
		}
		return 0;
	}

	@Override
	public Object getItem(int position) {
		if(listData!=null){
			return listData.get(position);
		}
		return null;
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	public List<T> getListData() {
		return listData;
	}

	public void setListData(List<T> listData) {
		this.listData = listData;
	}

}

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 bindViewDatas(Object holder,T t,int position);

}

HolderAdapter 继承于上面的AbstractAdapter类,将getView方法进行重写与抽象,使代码更加简洁,用起来更加简单,只要是继承于BaseAdapter的自定义适配器类,改为继承于HolderAdapter 基本上通用,然后只需实现BuildConvertView、buildHolder、bindViewDatas这三个方法。

下面是个自定义的测试适配器,继承HolderAdapter实现它的三个抽象方法:

public class TestHolderAdapter extends HolderAdapter<String>{

	public TestHolderAdapter(Context context, List<String> listData) {
		super(context, listData);
	}

	@Override
	public View buildConvertView(LayoutInflater layoutInflater) {
		return layoutInflater.inflate(R.layout.activity_list_item, null);
	}

	@Override
	public Object buildHolder(View convertView) {
		ViewHolder holder = new ViewHolder();
		holder.tv = (TextView)convertView.findViewById(R.id.tv);
		return holder;
	}

	@Override
	public void bindViewDatas(Object holder, String t, int position) {
		((ViewHolder)holder).tv.setText(t);
	}

	private static class ViewHolder{
		TextView tv;
	}

}
时间: 2024-08-23 18:09:27

Android之Adapter的封装与抽象的相关文章

Adapter的封装之路

原文:Adapter的封装之路 一.几种常见列表效果: 假如要用RecyclerView实现下面的几种效果,你会如何实现呢? 效果1:单布局效果 效果2:多布局效果 有多种Item布局 效果3:多布局多列效果 有多种Item布局,有的Item占1行,有的Item占1/2行 二.使用方法 1.原始的Adapter-单布局效果 在最原始的用法中,我们需要自己去继承RecyclerView.Adapter,然后写一大坨形式化的代码: 然后在Activity中调用这个Adapter,感觉很麻烦有木有?

Android技术18:Android中Adapter类详解

1.Adapter设计模式 Android中adapter接口有很多种实现,例如,ArrayAdapter,BaseAdapter,CursorAdapter,SimpleAdapter,SimpleCursorAdapter等,他们分别对应不同的数据源.例如,ArrayAdater对应List和数组数据源,而CursorAdapter对应Cursor对象(一般从数据库中获取的记录集).这些Adapter都需要getView方法返回当前列表项显示的View对象.当Model发生改变时,会调用Ba

七:Java之封装、抽象、多态和继承

本文章介绍了关于Java中的面向对象封装.抽象.继承.多态特点 Java面向对象主要有四大特性:封装.抽象.继承和多态. 一.封装 封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成"类",其中数据和函数都是类的成员. 在面向对象语言中,封装特性是由类来体现的,我们将现实生活中的一类实体定义成类,其中包括属性和行为(在Java中就是方法),就好像人类,可以具有name,sex,age等属性,同时也具有eat(),sle

企业级应用框架(二)三层架构之数据访问层的封装与抽象

接上一篇我们来对数据访问层进行封装与抽象.在上一篇我们知道,要解除BLL对DAL的依赖,我们就必须抽象出DAL层的接口,同时基于DAL的数据访问技术很多,如EF,ADO.NET,LINQ TO SQL,因此,我们的数据访问层必须对这些技术提供相应的支持.所以今天我们要做的事情有两件,第一,定义我们的数据访问层接口:第二,屏蔽各类数据库访问技术的差异,提供统一的数据库访问模型.举个例子,我们只需要修改一下我们的配置文件,就能够把ADO.NET的实现方式,改变成EF的实现方式.好下面搭建我们的三层构

Android 自定义Adapter 但listview 只显示第一条数据

楼主让这个问题郁闷了一晚上.....在logcat里明明显示adapter的getview方法里的list大于一条数据 ,但posotion却一直是0.....运行后也只显示list[0]里面的数据....最后的最后原来错误出在布局文件上 我以前的是这样的; <ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content" > <!-- listv

Android 自定义Adapter实现多视图Item的ListView

自定义Adapter实现多视图Item的ListView http://www.devdiv.com/adapter_item_listview-blog-20-7539.html Android 自定义Adapter实现多视图Item的ListView,布布扣,bubuko.com

Android中Adapter之BaseAdapter使用

Android界面中有时候需要显示稍微复杂的界面时,就需要我们自定义一个adapter,而此adapter就要继承BaseAdapter,重新其中的方法. Android中Adapter类其实就是把数据源绑定到指定的View上,然后再返回该View,而返回来的这个View就是ListView中的某一 行item.这里返回来的View正是由我们的Adapter中的getView方法返回的.这样就会容易理解数据是怎样一条一条显示在ListView 中的. 在完成这篇文章中的例子之后,我思考了很长时间

【转】Android自定义Adapter的ListView的思路及代码

原文网址:http://www.jb51.net/article/37236.htm Android自定义Adapter的ListView的思路及代码,需要的朋友可以参考一下 在开发中,我们经常使用到ListView这个控件.Android的API也提供了许多创建ListView适配器的快捷方式.例如ArrayAdapter.SimpleAdapter和SimpleCursorAdapter等.但你是否发现,如果采用这些系统自带的适配器,对于事件的响应只能局限在一个行单位.假设一行里面有一个按钮

Android之Adapter用法总结

http://blog.csdn.net/fznpcy/article/details/8658155 Android之Adapter用法总结 1.概念 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带.在常见的View(List View,Grid View)等地方都需要用到Adapter.如下图直观的表达了Data.Adapter.View三者的关系: Android中所有的Adapter一览: 由图可以看到在Android中与Adapter有关