适配器BaseAdapter的封装,提高开发效率

BaseAdapter是我们学习中入门就需要了解的适配器,主要用于给ListView,GridView等其他列表内容展示。
今天我主要是提供一个自己封装的BaseAdapter,并且感觉还挺实用的类給大家,减少一些重复的工作量,直接贴代码:

package com.tangyx.home.factory;

import android.content.Context;
import android.os.Build;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import org.json.JSONArray;
import org.json.JSONException;

import java.lang.reflect.Field;
import java.util.List;


/**
 * Created by tangyx on 15/9/21.
 *
 */
public abstract class BaseHomeAdapter extends BaseAdapter {
    public OnChildClickListener mChildClickListener;
    public JSONArray mArrays;
    public List mList;
    public Context mContext;
    private ViewHolder viewHolder;

    public BaseHomeAdapter(Context context) {
        this.mContext = context;
    }

    public BaseHomeAdapter(Context context, JSONArray arrays) {
        this(context);
        this.mArrays = arrays;
    }

    public BaseHomeAdapter(Context context, List list) {
        this(context);
        this.mList = list;
    }

    @Override
    public int getCount() {
        if (mList != null) {
            return mList.size();
        }
        if (mArrays != null) {
            return mArrays.length();
        }
        return 0;
    }

    @Override
    public Object getItem(int position) {
        try {
            if (mList != null) {
                return mList.get(position);
            }
            return mArrays.get(position);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        try {
            if (convertView == null) {
                LayoutInflater inflater = LayoutInflater.from(mContext);
                convertView = onBindView(inflater);
                viewHolder = new ViewHolder(convertView);
                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
            onBindData(position, convertView, parent);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return convertView;
    }

    /**
     * 保存对象
     */
    private class ViewHolder {
        View view;
        SparseArray<View> holderArray;

        ViewHolder(View view) {
            this.view = view;
            holderArray = new SparseArray<>();
        }
    }

    /**
     * 绑定item布局
     * @param inflater
     * @return
     * @throws Exception
     */
    public abstract View onBindView(LayoutInflater inflater) throws Exception;

    /**
     * 获取item布局中的控件
     * @param position
     * @param convertView
     * @param parent
     * @throws Exception
     */
    public abstract void onBindData(int position, View convertView, ViewGroup parent) throws Exception;

    /**
     * 获取一个缓存的view
     *
     * @param id
     * @param <T>
     * @return
     */
    public <T extends View> T obtainView(int id) {
        return obtainView(viewHolder.view,id,0);
    }
    public <T extends View> T obtainView(View layout,int id,int position) {
        View view = viewHolder.holderArray.get(layout.getId()+id+position);
        if (null != view) {
            return (T) view;
        }
        view =layout.findViewById(id);
        if (null == view) {
            return null;
        }
        viewHolder.holderArray.put(layout.getId()+id+position, view);
        return (T) view;
    }
    /**
     * 获取一个参数值
     */
    public <T extends Object> T get(int index) {
        Object val;
        if (mArrays != null) {
            try {
                val = mArrays.get(index);
                return (T) val;
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        if (mList != null) {
            val = mList.get(index);
            return (T) val;
        }
        return null;
    }

    /**
     * 移除元素
     */
    public Object remove(int index) {
        if (mList != null) {
            return mList.remove(index);
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            return mArrays.remove(index);
        }
        Field valuesField;
        try {
            valuesField = JSONArray.class.getDeclaredField("values");
            valuesField.setAccessible(true);
            List<Object> values = (List<Object>) valuesField.get(mArrays);
            if (index < values.size()) {
                return values.remove(index);
            }
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 移除所有元素
     */
    public void removeAll() {
        if (mArrays != null) {
            mArrays = new JSONArray();
        }
        if (mList != null) {
            mList.clear();
        }
        notifyDataSetChanged();
    }

    /**
     * 添加一个item
     * @param object
     */
    public void addItem(Object object) {
        if (mArrays != null) {
            mArrays.put(object);
        }
        if (mList != null) {
            mList.add(object);
        }
    }

    /**
     * 替换所有的元素
     * @param jsonArray
     */
    public void replaceAll(JSONArray jsonArray) {
        this.mArrays = jsonArray;
        this.mList = null;
        notifyDataSetChanged();
    }

    /**
     * 替换所有的元素
     * @param list
     */
    public void replaceAll(List list) {
        this.mList = list;
        this.mArrays = null;
        notifyDataSetChanged();
    }

    /**
     * item其他元素的点击事件
     * @param mChildClickListener
     */
    public void setChildClickListener(OnChildClickListener mChildClickListener) {
        this.mChildClickListener = mChildClickListener;
    }

    public interface OnChildClickListener {
        void onChildClick(View... view);
    }

}

代码也还算简介,支持List集合和JsonArray两种类型,如果还有其他集合,可根据需求自己更改,下面再介绍一下使用:

package com.tangyx.home.factory;

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

import com.tangyx.home.demo.R;

import java.util.List;

/**
* Created by tangyx on 2016/12/16.
*
*/

public class SimpleAdapter extends BaseHomeAdapter {

   public SimpleAdapter(Context context, List list) {
       super(context, list);
   }

   @Override
   public View onBindView(LayoutInflater inflater) throws Exception {
       //替换成你自己的item布局
       return inflater.inflate(R.layout.adapter_item,null);
   }

   @Override
   public void onBindData(int position, View convertView, ViewGroup parent) throws Exception {
       //获取item布局的控件
       TextView mName = obtainView(R.id.name);
       //获取一个list中一个对象
       Simple mSimple = get(position);
   }
}

很简单,直接继承BaseHomeAdapter即可。
总结:很多时候写的代码多了,你就会去总结怎么让代码更佳完美,开发效率更加高效,我就喜欢分享一些简单又实用的东西。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容