android adapter公共写法

在开发过程中,会写很多的adapter类,其中很多公共的部分,不需要每次都去书写,可以为开发者省下很多时间

提取一个ListViewAdapter

public abstract class ListViewAdapter<T> extends BaseAdapter {

    //为了让子类访问,于是将属性设置为protected
    protected Context mContext;
    protected List<T> mDatas;
    protected LayoutInflater mInflater;
    private int layoutId; //不同的ListView的item布局肯能不同,所以要把布局单独提取出来

    public ListViewAdapter(Context context, List<T> datas, int layoutId) {
        this.mContext = context;
        mInflater = LayoutInflater.from(context);
        this.mDatas = datas;
        this.layoutId = layoutId;
    }

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

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

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

    /**
     * 添加数据,
     *
     * @param aList
     */
    public void addData(List<T> aList) {
        if (aList != null && aList.size() > 0) {
            mDatas.addAll(aList);
        }
        notifyDataSetChanged();
    }

    /**
     * 获取数据
     *
     * @return
     */
    public List<T> getData() {
        return mDatas;
    }

    /**
     * 设置数据,
     *
     * @param sList
     */
    public void setData(List<T> sList) {
        mDatas.clear();
        addData(sList);
    }

    /**
     * 清空数据
     */
    public void clear() {
        mDatas.clear();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //初始化ViewHolder,使用通用的ViewHolder,一样代码就搞定ViewHolder的初始化咯
        ViewHolder holder = ViewHolder.get(mContext, convertView, parent, layoutId, position);//layoutId就是单个item的布局

        convert(holder, getItem(position));
        return holder.getConvertView(); //这一行的代码要注意了
    }

    //将convert方法公布出去
    public abstract void convert(ViewHolder holder, T t);

}

可复用ViewHolder代码

public class ViewHolder {
    private SparseArray<View> mViews;
    private int mPosition;
    private View mConvertView;

    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 layoutId, int position) {
        if (convertView == null) {
            return new ViewHolder(context, parent, layoutId, position);
        } else {
            ViewHolder holder = (ViewHolder) convertView.getTag();
            holder.mPosition = position; //即时ViewHolder是复用的,但是position记得更新一下
            return holder;
        }
    }

    /*
    通过viewId获取控件
     */
    //使用的是泛型T,返回的是View的子类
    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;
    }

    public View getConvertView() {
        return mConvertView;
    }
}

再看看现在的adapter类

public class ExampleAdapter extends ListViewAdapter<String> {
    public MsgTemplateAdapter(Context context, List<String> datas) {
        super(context, datas, R.layout.template_list_item);
    }

    @Override
    public void convert(ViewHolder holder, String s) {
        ((TextView) holder.getView(R.id.name)).setText(s);
    }
}

看到这么简洁的代码,是不是感觉整个人都精神了

参考:http://www.cnblogs.com/smyhvae/p/4477079.html

 

【声明】

欢迎转载,但请保留文章原始出处

博客地址:http://www.cnblogs.com/lping/

文章来源:http://www.cnblogs.com/lping/articles/5470781.html

 

时间: 2024-10-14 11:01:27

android adapter公共写法的相关文章

Android Adapter详解

Android Adapter Adapter是用来帮助填充数据的中间桥梁,比如通过它将数据填充到ListView, GridView, Gallery.而android 提供了几种Adapter:ArrayAdapter, BaseAdapter, CursorAdapter, HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter

[项目总结]论Android Adapter notifyDataSetChanged与notifyDataSetInvalidated无效原因

最近在开发中遇到一个问题,Adapter中使用notifyDataSetChanged 与notifyDataSetInvalidated无效,经过思考和网上查找,得出如下原因. 首先看一下notifyDataSetChanged与notifyDataSetInvalidated的区别 我们可应用粮仓来解释一下,两者的区别. notifyDataSetChanged:粮仓中得粮食少了,或者多了,发送通知. notifyDataSetInvalidated:粮仓变换了,比如原来从A仓取粮食,现在换

Android——Adapter

Android——Adapter 基本概念 Adapter(适配器),将一个类的接口变换成客户端所期待的一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作.显然Adapter的存在就是为了配合两个不同部分之间的互相协作,使之能够协调工作.在Android中,Adapter是前台UI与底层数据之间联系的纽带,它们之间的关系可表示如下图. 常用Adapter Adapter本身只是一个接口,它派生了ListAdapter和SpinnerAdapter两个子接口,其中ListAda

Android adapter适配器的使用

ListView之SimpleAdapter SimpleAdapter的构造函数是: public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) 参数context:上下文,比如this.关联SimpleAdapter运行的视图上下文 参数data:Map列表,列表要显示的数据,这部分需要自己实现,如例子中的ge

Android Adapter的一些记录

一.摘要 An Adapter object acts as a bridge between an AdapterView and the underlying data for that view. The Adapter provides access to the data items. The Adapter is also responsible for making a View for each item in the data set. 这是Android官方对Adapter的

cocos2d-x 3.0 引用第三方库 及编译成apk时android mk文件写法

cocos2d-x 3.0 中,如果你需要使用CocosStudio.Extensions扩展库 等等,都需要自己手动添加. 添加步骤如下:(比如说现在我要添加libExtensions,libCocosStudio , libGUI) 1.添加附加项目 右击解决方案--->添加现有项目--->添加:项目目录\cocos2d\extensions\proj.win32\libExtensions,然后你会发现左边多了一个libExtensions扩展库 右击解决方案--->添加现有项目-

[转]Android Adapter以及getView()方法的理解

Android Adapter基本理解: 我的理解是: 1.一个有许多getter的类(就是getView(),getCount()....这些方法) 2.有多少个get方法?都是什么? 这些getter是特定的,你可以复写他们,全部的方法如下 其中一般我们只用复写getCount(),getView(),getItemId(),getItem()这四个方法 3.这些被谁调用? 这些getter是被android系统自行调用的(具体如何调用,作为像我这样的新手做稍微了解就好) 4.为什么要复写这

Android一个Adapter的写法

public class NewsListAdapter extends BaseAdapter { private Context mContext; private LinkedList<NewsModel> newsList; public NewsListAdapter(Context mContext, LinkedList<NewsModel> newsList) { this.mContext = mContext; this.newsList = newsList

Android Adapter代码片

/** * Adapter for grid of coupons. */ private static class CouponAdapter extends BaseAdapter { private LayoutInflater mInflater; private List<Coupon> mAllCoupons; /** * Constructs a new {@link CouponAdapter}. * * @param inflater to create new views