慕课网 万能适配器学习笔记

首先再次感谢 慕课网的技术大牛分享了该课程。

一.传统 ListView 适配器的模式:1. 创建Listview,并为listview 创建item布局2.封装数据 3.为Item布局创建特定的适配器 用于数据展示。(在这过程中,如果某一个ListView 的item中控件过多,控件的生命及调用会导致代码量上升,而如果一个app中有很多个地方需要用到ListView 时,需要分别写多个适配器,会导致很多重复性的操作,为了避免这种情况的发生,让编码更轻松,可参考 慕课网Android万能适配器 的编写。)。

传统Adapter 编码风格如下:

package com.imooc.imooc_adapter;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class MyAdapter extends BaseAdapter {
    private Context context;
    private List<Bean> mlist;
    public MyAdapter(Context context, List<Bean> mlist) {
        super();
        this.context = context;
        this.mlist = mlist;
    }

    public List<Bean> getMlist() {
        return mlist;
    }

    public void setMlist(List<Bean> mlist) {
        this.mlist = mlist;
    }

    @Override
    public int getCount() {
        return mlist.size();
    }

    @Override
    public Object getItem(int arg0) {
        return mlist.get(arg0);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHoler holder =null;
        if (convertView ==null) {
            holder = new ViewHoler();
            convertView = ((LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE))
                    .inflate(R.layout.item, parent,false);
            holder.name= (TextView) convertView.findViewById(R.id.name);
            holder.phone = (TextView) convertView.findViewById(R.id.phone);
            convertView.setTag(holder);
        }else{
            convertView.setTag(holder);
        }
        final Bean bean = mlist.get(position);
        holder.name.setText(bean.getUsername());
        holder.phone.setText(bean.getPhone());
        return convertView;
    }
    class ViewHoler{
        TextView name;
        TextView phone;
    }

}

万能Adapter代码如下:

package com.imooc.imooc_adapter;

import java.util.List;

import android.content.Context;

import com.imooc.util.CommonAdapter;
import com.imooc.util.ViewHolder;

public class NewAdapter  extends CommonAdapter<Bean>{
	public NewAdapter(Context context, List<Bean> mdatas,int layoutId) {
		super(context, mdatas,layoutId);
	}
	@Override
	public void convert(ViewHolder holder, Bean bean) {
		holder.setText(R.id.phone, bean.getPhone()).setText(R.id.name, bean.getUsername());
	}

}

由此可见 万能Adapter 可精简的代码量有多少了。

万能适配器 把用户自定义的 ViewHolder 和BaseAdapter 的声明等进行了封装,调用时,需要 CommonAdapter 和ViewHoler 这两个类。

万能适配器 编写逻辑:

1. 封装ViewHolder,将View convertView 解放出来,实现一条代码 即可完成 convertView的实例化:

ViewHolder holder = ViewHolder.get(mcontext, convertView, parent, postion, layoutId);

实现方式:

public class ViewHolder {
	private SparseArray<View> mViews;
	private Context mcontext;
	private View mConvertView;
	private int mposition;

	public View getmConvertView() {
		return mConvertView;
	}

	public int getMposition() {
		return mposition;
	}

	public ViewHolder(Context context, ViewGroup parent, int layoutId,
			int position) {
		this.mposition = position;
		this.mViews = new SparseArray<View>();
		mConvertView = LayoutInflater.from(context).inflate(layoutId, parent,
				false);
		mConvertView.setTag(this);
	}

	public static ViewHolder get(Context context, View convertView,
			ViewGroup parent, int position, int layoutId) {
		if (convertView == null) {
			return new ViewHolder(context, parent, layoutId, position);
		} else {
			ViewHolder holder = (ViewHolder) convertView.getTag();
			holder.mposition = position;
			return holder;
		}
	}

	public <T extends View> T getView(int viewid) {
		View view = mViews.get(viewid);
		if (view == null) {
			view = mConvertView.findViewById(viewid);
			mViews.put(viewid, view);
		}
		return (T) view;
	}

此处使用 spareArray  类似于:List<int,Object> 形式的存放,想比较HashMap<int,Object> 来说更加节省时间,提高效率。

创建抽象类 CommonAdapter:

public abstract class CommonAdapter<T> extends BaseAdapter {
	protected Context mcontext;
	protected List<T> mDatas;
	protected LayoutInflater mInlater;
	private int layoutId;
	public CommonAdapter(Context context ,List<T> datas,int layoutId) {
		this.mcontext = context;
		this.mDatas= datas;
		this.layoutId = layoutId;
		mInlater = LayoutInflater.from(context);
	}

	public Context getMcontext() {
		return mcontext;
	}

	public void setMcontext(Context mcontext) {
		this.mcontext = mcontext;
	}

	public List<T> getmDatas() {
		return mDatas;
	}

	public void setmDatas(List<T> mDatas) {
		this.mDatas = mDatas;
	}

	@Override
	public int getCount() {
		return mDatas.size();
	}

	@Override
	public T getItem(int arg0) {
		return mDatas.get(arg0);
	}

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

	@Override
	public  View getView(int postion, View convertView, ViewGroup parent){
		ViewHolder holder = ViewHolder.get(mcontext, convertView, parent, postion, layoutId);
		convert(holder, getItem(postion));
		return holder.getmConvertView();
	};
	public abstract void convert(ViewHolder holder,T t);
}

将 convert 方法 对外开放给开发者,进行简单的赋值操作。

在 自定义的Adapter 中继承 CommonAdapter:

 public class NewAdapter  extends CommonAdapter<Bean>{
    public NewAdapter(Context context, List<Bean> mdatas,int layoutId) {
        super(context, mdatas,layoutId);
    }
    @Override
    public void convert(ViewHolder holder, Bean bean) {
        holder.setText(R.id.phone, bean.getPhone()).setText(R.id.name, bean.getUsername());
    }
}

在MainActivity中初始化自定义Adapter时,可使用:

adapter= new NewAdapter(getApplicationContext(), mList,R.layout.item);

其中,可以在 ViewHolder 封装类中封装 Adapter中对 控件的操作

public ViewHolder setText(int viewId, String text) {
        TextView tv = getView(viewId);
        tv.setText(text);
        return this;
    }
public ViewHolder setImageResource(int viewId,int resId){
        ImageView img= getView(viewId);
        img.setImageResource(resId);
        return this;

    }

例子如上.

时间: 2024-10-27 13:43:05

慕课网 万能适配器学习笔记的相关文章

慕课网-软件测试基础-学习笔记

测试阶段 单元测试 定义 对软件的最小可测试单元进行测试(函数.模块) 原则 1. 尽可能保证测试用例是相互独立 反面教材: 2. 一般由代码的开发人员负责(保证所开发的代码符合自己的设计) 益处 1. 能够尽可能早地发现缺陷(越早发现,代价越低) 2. 有利于重构(软件开发不变的就是重构) 3. 有利于简化集成 (通过单元测试,保证小的单元模块的正确性和稳定性,从而在集成测试的阶段,能够将精力聚焦于模块之间的关系上) 4. 文档(现代敏捷测试,推崇减少文档,利用单元测试,生成"代码文档&quo

慕课网JavaScript深入浅出学习笔记之数据类型

JavaScript数据类型 六种数据类型(五种原始类型,一种对象类型) number sttring boolean null undefined object #对象 Function Array Date ... javascript数据类型是弱数据类型,在定义变量时无需指定数据类型. var num = 32; num = "this is a string"; 32 + 32 // 64 #加法运算 //"+"理解为字符串拼接,"-"理

Spring3.0官网文档学习笔记(五)--3.3

3.3 概述 Table 3.1. The bean definition Property Explained in... class Section 3.3.2, "Instantiating beans" name Section 3.3.1, "Naming beans" scope Section 3.5, "Bean scopes" constructor arguments Section 3.4.1, "Dependen

Spring3.0官网文档学习笔记(六)--3.4.1

3.4 依赖 3.4.1 依赖注入 依赖注入两种方式:基于构造器的DI.基于setter方法的DI. 3.4.1.1 基于构造器的DI 参数是引入对象,且之前不存在父-子类关系: package x.y; public class Foo { public Foo(Bar bar, Baz baz) { // ... } } <beans> <bean id="foo" class="x.y.Foo"> <constructor-arg

Spring3.0官网文档学习笔记(七)--3.4.2

3.4.2 依赖与配置的细节 3.4.2.1  Straight values (primitives, Strings, and so on) JavaBeans PropertyEditors被用来转换这些value到实际的类型.? <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <

Spring3.0官网文档学习笔记(四)--3.1~3.2.3

3.1 Spring IoC容器与Beans简介 BeanFactory接口提供对任意对象的配置: ApplicationContext是BeanFactory的子接口,整合了Spring Aop功能,消息资源控制,事件发布,应用层特殊的上下文(在web应用中) 由IoC容器实例化.组装.管理的对象都是Bean 3.2 容器概述 org.springframework.context.ApplicationContext代表Spring IoC容器,并且负责通过读取配置元数据来实例化.配置.组装

Spring3.0官网文档学习笔记(八)--3.4.3~3.4.6

3.4.3 使用depends-on 使用depends-on可以强制使一个或多个beans先初始化,之后再对这个bean进行初始化. 多个bean之间用",".";"." "隔开. <bean id="beanOne" class="ExampleBean" depends-on="manager"/> <bean id="manager" cla

Spring3.0官网文档学习笔记(二)

1.3 使用场景 典型的成熟的spring web应用 spring使用第三方框架作为中间层 远程使用场景 EJB包装 1.3.1 依赖管理.命名规则(包) spring-*.jar *号代表的是模块的简写,如:spring-core, spring-webmvc, spring-jms 可以在四个不同的地方找到Spring: http://www.springsource.org/downloads/community  所有的jar包被打包成zip,名称从3.0开始是: org.spring

Spring3.0官网文档学习笔记(一)

Part 1 Spring框架概述 Spring是模块化的,在应用中只需要引入你所需要用到的模块的jar包,其余的jar包不用引入. spring框架支持声明式的事务管理,通过RMI或web service访问你的逻辑,还有许多种方式保存数据. spring被设计成非侵入式的. 1.Spring框架简介 Spring框架提供了应用开发的基础部分,使得我们可以集中精神在业务开发层上. POJOS:plain old Java objects Spring允许创建非侵入式的POJO.这个特性支持Ja