adapter 使用butterknife的簡(jiǎn)單封裝

###############原來(lái)寫(xiě)listview / recyclerView 適配器, 都是使用的這種方式:
https://github.com/hongyangAndroid/baseAdapter

###############在butterknife出來(lái)之前這種方式堪稱完美佃却,但是隨著butterknife的出現(xiàn),原來(lái)那種寫(xiě)適配器的方式漸漸的被摒棄了脑慧。

原因無(wú)外乎以下兩點(diǎn):
1.butterknife實(shí)在太好用了,配合android studio插件君纫,一鍵生成,那種感覺(jué)無(wú)與倫比的爽。
2.鴻洋的這種方式也有小缺陷檬某, 每次對(duì)viewHolder里面的view操作的時(shí)候替梨,要么findViewById實(shí)例化一個(gè)钓试,要么 傳遞id進(jìn)去装黑。

.
.

比如設(shè)置TextView:
holder.setText(R.id.tv, "文字");
所以針對(duì)butterknife,自己對(duì)如上的適配器做了不小的改動(dòng)弓熏,由于本人水平有限恋谭,如果你覺(jué)得哪里不合適,或者覺(jué)得哪里可以改進(jìn)的地方挽鞠,盡管提意見(jiàn)疚颊,大家互相學(xué)習(xí)。下面貼上代碼:

.
.

ListView的adapter:

使用起來(lái)也很簡(jiǎn)單:(其中xxViewHolder 必須繼承BaseViewHolder)


 adapter = new MBaseAdapter<Bean, xxViewHolder>() {
           @Override
           public xxViewHolder getHolder(View convertView, int type) {
               return new xxViewHolder(convertView);
           }

           @Override
           public void getItemView(xxViewHolder holder, Bean item) {
                holder.text.setText(item.text);
                holder.image.loadImage(item.getUrl());
           }
       }

封裝的代碼:


/**
 * listView適配器的基類
 *  單種布局的
 * @param <T>
 * @param <VH>
 */

public abstract class MBaseAdapter<T, VH extends BaseViewHolder> extends BaseAdapter {


    protected Context mContext;
    
    protected List<T> list;
    
    protected int layoutId;
    
    public MBaseAdapter(List<T> list, Context context, int layoutId)
    {
        mContext = context;
        this.list = list;
        this.layoutId = layoutId;
    }

    public List<T> getList(){
        return list;
    }
    
    @Override
    public int getCount() {
        return null != list ? list.size() : 0;
    }

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

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

    @Override
    @SuppressWarnings("unchecked")
    public View getView(int position, View convertView, ViewGroup parent)
    {
        VH holder;

        if (convertView == null) {

            convertView = View.inflate(mContext, layoutId, null);;
            holder = getHolder(convertView, getItemViewType(position));
            convertView.setTag(holder);
        } else {
            holder = (VH) convertView.getTag();
        }
        holder.position = position;
        getItemView(holder, list.get(position));

        return convertView;
    }

    public abstract VH getHolder(View convertView, int type);
    public abstract void getItemView(VH holder, T item);
}


/**
 * 支持多種類型的adapter
 * @author deadline
 * @time 2016/10/17
 */
public abstract class MultiBaseAdapter<T> extends MBaseAdapter<T, BaseViewHolder> implements MultiSupport<T>{

    public MultiBaseAdapter(List<T> list, Context context) {
        super(list, context, -1);
    }

    @Override
    public int getItemViewType(int position) {

        return getItemType(position, list.get(position));
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        BaseViewHolder holder;
        int type = getItemViewType(position);
        int layoutId = getLayoutId(type);

        if (convertView == null) {
            convertView = View.inflate(mContext, layoutId, null);
            holder = getHolder(convertView, type);
            convertView.setTag(holder);
        } else {
            holder = (BaseViewHolder) convertView.getTag();
            if (holder.type != type) {
                convertView = View.inflate(mContext, layoutId, null);
                holder = getHolder(convertView, type);
                convertView.setTag(holder);
            }
        }
        holder.position = position;
        getItemView(holder, list.get(position));

        return convertView;
    }
}


/**
 * 多種類型支持接口
 * @author deadline
 * @time 2016/10/17
 */
public interface MultiSupport<T> {

    int getViewTypeCount();

    int getLayoutId(int viewType);

    int getItemType(int position, T item);
}

BaseViewHolder 自定義的viewHodler都要繼承該類


public class BaseViewHolder {

    public int type;

    public int position;

    public BaseViewHolder(View view) {
        ButterKnife.bind(this, view);
    }

    /**
     * 多種類型
     * @param view
     * @param type
     */
    public BaseViewHolder(View view, int type) {
        this.type = type;
        ButterKnife.bind(this, view);
    }
}

RecyclerView的適配器

public abstract class MRecyclerBaseAdapter<T, VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {

    protected Context mContext;

    protected List<T> list;

    public MRecyclerBaseAdapter(Context mContext, List<T> list) {

        this.list = list;

        this.mContext = mContext;
    }

    @Override
    public VH onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(getLayoutId(), null);
        return getHolder(view);
    }

    @Override
    public void onBindViewHolder(final VH holder, final int position) {

        getItemView(holder, list.get(position));

        RxView.clicks(holder.itemView).throttleFirst(500, TimeUnit.MILLISECONDS)
                .subscribe(new Action1<Void>() {
                    @Override
                    public void call(Void aVoid) {
                        OnItemClick(holder, list.get(position), position);
                    }
                });

        RxView.longClicks(holder.itemView).throttleFirst(500, TimeUnit.MILLISECONDS)
                .subscribe(new Action1<Void>() {
                    @Override
                    public void call(Void aVoid) {
                        OnItemLongClick(holder, list.get(position), position);
                    }
                });

    }

    public abstract void getItemView(VH holder, T item);

    public abstract int getLayoutId();

    public abstract VH getHolder(View convertView);

    public void OnItemClick(VH holder, T item, int position) {}

    public void OnItemLongClick(VH holder, T item, int position) {}

    public List<T> getList() {
        return list;
    }

    @Override
    public int getItemCount() {
        return list != null ? list.size() : 0;
    }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末信认,一起剝皮案震驚了整個(gè)濱河市材义,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌狮杨,老刑警劉巖母截,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異橄教,居然都是意外死亡清寇,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)护蝶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)华烟,“玉大人,你說(shuō)我怎么就攤上這事持灰】梗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵堤魁,是天一觀的道長(zhǎng)喂链。 經(jīng)常有香客問(wèn)我,道長(zhǎng)妥泉,這世上最難降的妖魔是什么椭微? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮盲链,結(jié)果婚禮上蝇率,老公的妹妹穿的比我還像新娘。我一直安慰自己刽沾,他們只是感情好本慕,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著侧漓,像睡著了一般锅尘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上布蔗,一...
    開(kāi)封第一講書(shū)人閱讀 49,856評(píng)論 1 290
  • 那天鉴象,我揣著相機(jī)與錄音忙菠,去河邊找鬼何鸡。 笑死纺弊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的骡男。 我是一名探鬼主播淆游,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼隔盛!你這毒婦竟也來(lái)了犹菱?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吮炕,失蹤者是張志新(化名)和其女友劉穎腊脱,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體龙亲,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡陕凹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鳄炉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杜耙。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拂盯,靈堂內(nèi)的尸體忽然破棺而出佑女,到底是詐尸還是另有隱情,我是刑警寧澤谈竿,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布团驱,位于F島的核電站,受9級(jí)特大地震影響空凸,放射性物質(zhì)發(fā)生泄漏嚎花。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一劫恒、第九天 我趴在偏房一處隱蔽的房頂上張望贩幻。 院中可真熱鬧,春花似錦两嘴、人聲如沸丛楚。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)趣些。三九已至,卻和暖如春贰您,著一層夾襖步出監(jiān)牢的瞬間坏平,已是汗流浹背拢操。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舶替,地道東北人令境。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像顾瞪,于是被迫代替她去往敵國(guó)和親舔庶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349

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