適配器BaseAdapter的封裝,提高開發(fā)效率

BaseAdapter是我們學(xué)習(xí)中入門就需要了解的適配器剖效,主要用于給ListView灼擂,GridView等其他列表內(nèi)容展示壁查。
今天我主要是提供一個(gè)自己封裝的BaseAdapter,并且感覺還挺實(shí)用的類給大家剔应,減少一些重復(fù)的工作量睡腿,直接貼代碼:

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;
    }

    /**
     * 保存對(duì)象
     */
    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;

    /**
     * 獲取一個(gè)緩存的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;
    }
    /**
     * 獲取一個(gè)參數(shù)值
     */
    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();
    }

    /**
     * 添加一個(gè)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其他元素的點(diǎn)擊事件
     * @param mChildClickListener
     */
    public void setChildClickListener(OnChildClickListener mChildClickListener) {
        this.mChildClickListener = mChildClickListener;
    }

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

}

代碼也還算簡(jiǎn)介,支持List集合和JsonArray兩種類型峻贮,如果還有其他集合席怪,可根據(jù)需求自己更改,下面再介紹一下使用:

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);
       //獲取一個(gè)list中一個(gè)對(duì)象
       Simple mSimple = get(position);
   }
}

很簡(jiǎn)單纤控,直接繼承BaseHomeAdapter即可挂捻。
總結(jié):很多時(shí)候?qū)懙拇a多了,你就會(huì)去總結(jié)怎么讓代碼更佳完美船万,開發(fā)效率更加高效刻撒,我就喜歡分享一些簡(jiǎn)單又實(shí)用的東西。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末唬涧,一起剝皮案震驚了整個(gè)濱河市疫赎,隨后出現(xiàn)的幾起案子盛撑,更是在濱河造成了極大的恐慌碎节,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抵卫,死亡現(xiàn)場(chǎng)離奇詭異狮荔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)介粘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門殖氏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人姻采,你說我怎么就攤上這事雅采。” “怎么了慨亲?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵婚瓜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我刑棵,道長(zhǎng)巴刻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任蛉签,我火速辦了婚禮胡陪,結(jié)果婚禮上沥寥,老公的妹妹穿的比我還像新娘。我一直安慰自己柠座,他們只是感情好邑雅,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著妈经,像睡著了一般蒂阱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狂塘,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天录煤,我揣著相機(jī)與錄音,去河邊找鬼荞胡。 笑死妈踊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的泪漂。 我是一名探鬼主播廊营,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼萝勤!你這毒婦竟也來了露筒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤敌卓,失蹤者是張志新(化名)和其女友劉穎慎式,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趟径,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瘪吏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蜗巧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掌眠。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖幕屹,靈堂內(nèi)的尸體忽然破棺而出蓝丙,到底是詐尸還是另有隱情,我是刑警寧澤望拖,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布渺尘,位于F島的核電站,受9級(jí)特大地震影響靠娱,放射性物質(zhì)發(fā)生泄漏沧烈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一像云、第九天 我趴在偏房一處隱蔽的房頂上張望锌雀。 院中可真熱鬧蚂夕,春花似錦、人聲如沸腋逆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惩歉。三九已至等脂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撑蚌,已是汗流浹背上遥。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留争涌,地道東北人粉楚。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像亮垫,于是被迫代替她去往敵國和親模软。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容