Android項(xiàng)目實(shí)踐——自定義RecyclerViewAdapter模板代碼

版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
系列教程:Android開發(fā)之從零開始系列

大家要是看到有錯(cuò)誤的地方或者有啥好的建議,歡迎留言評(píng)論

前言:項(xiàng)目開發(fā)中難免會(huì)敲很多重復(fù)的代碼,尤其是像 Adapter(適配器)這種使用頻率高且格式基本一致的類,這篇博客將以 RecyclerViewAdapter為例教大家如何自定義自己的模板代碼實(shí)現(xiàn)一鍵生成


一般RecyclerViewAdapter中會(huì)包含初始化方法ViewHolder,設(shè)置列表項(xiàng)點(diǎn)擊或長(zhǎng)按的接口等等,下面是RecyclerViewAdapter的一個(gè)例子

package com.test.bauztest.BaseRecyclerViewAdapter;//你的包名

//各種類的導(dǎo)入
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
import java.util.Map;

//類的File Header
/**
 * Created by anlia on 2017/10/30.
 */
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> {

    private Context context;
    private List<Map<String,String>> list;//聲明一個(gè)傳參類型為Map<String,String>的list
    private OnItemClickListener mOnItemClickListener;

    class ViewHolder extends RecyclerView.ViewHolder{
        // TODO: 聲明組件

        public ViewHolder(View view) {
            super(view);
            // TODO: 注冊(cè)組件,view.findViewById(R.id.xxx)
        }

    }

    public MyRecyclerViewAdapter(Context context,List<Map<String,String>> list) {
        this.context = context;
        this.list = list;
    }

    public interface OnItemClickListener {
        void onItemClick(View view, int position);
        void onItemLongClick(View view , int position);
    }

    public void setOnItemClickListener(OnItemClickListener mOnItemClickListener){
        this.mOnItemClickListener = mOnItemClickListener;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // TODO: 為對(duì)應(yīng)itemViewId賦值,例:R.layout.xxx
        int itemViewId = 0;
        ViewHolder holder = new ViewHolder(LayoutInflater.from(context).inflate(itemViewId, parent, false));
        return holder;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        // TODO: 綁定組件的事件


        // 如果設(shè)置了回調(diào),則設(shè)置點(diǎn)擊事件
        if (mOnItemClickListener != null)
        {
            holder.itemView.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    int pos = holder.getLayoutPosition();
                    mOnItemClickListener.onItemClick(holder.itemView, pos);
                }
            });

            holder.itemView.setOnLongClickListener(new View.OnLongClickListener()
            {
                @Override
                public boolean onLongClick(View v)
                {
                    int pos = holder.getLayoutPosition();
                    mOnItemClickListener.onItemLongClick(holder.itemView, pos);
                    return false;
                }
            });
        }
    }

    @Override
    public int getItemCount() {
        return list.size();
    }
}

基本每個(gè)Adapter都包含上面這些內(nèi)容,經(jīng)常復(fù)制粘貼然后再去改類名是非常影響開發(fā)效率的一件事,我們可以利用Android Studio中設(shè)置模板代碼的功能來減輕我們的負(fù)擔(dān),進(jìn)入模板代碼設(shè)置有兩種方法

  • 點(diǎn)擊File → Settings → Editor → File and Code Templates,然后點(diǎn)擊新增,編寫我們的模板代碼即可,如圖
  • 還有另外一種方法更加快捷,點(diǎn)擊File → New → Edit File Templates

因?yàn)槟0宕a要有通用性,所以包名、類名以及List的傳參我們都不能寫死,上面的Adapter例子需要略微修改,注意模板代碼中修改的地方

//自動(dòng)生成包名
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;

//用默認(rèn)的File Header即可
#parse("File Header.java")
public class ${NAME}<E> extends RecyclerView.Adapter<${NAME}.ViewHolder> {//包名也需要自動(dòng)生成,同時(shí)注意List傳參為泛型

    private Context context;
    private List<E> list;//數(shù)據(jù)集合
    private OnItemClickListener mOnItemClickListener;

    class ViewHolder extends RecyclerView.ViewHolder{
        // TODO: 聲明組件

        public ViewHolder(View view) {
            super(view);
            // TODO: 注冊(cè)組件,view.findViewById(R.id.xxx)
        }

    }

    public ${NAME}(Context context,List<E> list) {
        this.context = context;
        this.list = list;
    }

    public interface OnItemClickListener {
        void onItemClick(View view, int position);
        void onItemLongClick(View view , int position);
    }

    public void setOnItemClickListener(OnItemClickListener mOnItemClickListener){
        this.mOnItemClickListener = mOnItemClickListener;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // TODO: 為對(duì)應(yīng)itemViewId賦值,例:R.layout.xxx
        int itemViewId = 0;
        ViewHolder holder = new ViewHolder(LayoutInflater.from(context).inflate(itemViewId, parent, false));
        return holder;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        // TODO: 綁定組件的事件


        // 如果設(shè)置了回調(diào),則設(shè)置點(diǎn)擊事件
        if (mOnItemClickListener != null)
        {
            holder.itemView.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    int pos = holder.getLayoutPosition();
                    mOnItemClickListener.onItemClick(holder.itemView, pos);
                }
            });

            holder.itemView.setOnLongClickListener(new View.OnLongClickListener()
            {
                @Override
                public boolean onLongClick(View v)
                {
                    int pos = holder.getLayoutPosition();
                    mOnItemClickListener.onItemLongClick(holder.itemView, pos);
                    return false;
                }
            });
        }
    }

    @Override
    public int getItemCount() {
        return list.size();
    }
}

模板代碼設(shè)置好后,我們只需要簡(jiǎn)單幾步即可自動(dòng)生成RecyclerViewAdapter代碼

至此本篇教程到此結(jié)束,如果大家看了感覺還不錯(cuò)麻煩點(diǎn)個(gè)贊,你們的支持是我最大的動(dòng)力~


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,036評(píng)論 25 709
  • 1 背景 一個(gè)項(xiàng)目開發(fā)必然會(huì)涉及團(tuán)隊(duì)協(xié)作,而工程質(zhì)量就需要團(tuán)隊(duì)去保證。一般我們期望的代碼:無潛在風(fēng)險(xiǎn)、無重復(fù)邏輯、...
    zyl06閱讀 3,291評(píng)論 5 16
  • 上周五的互動(dòng)話題是“和青春期的戰(zhàn)爭(zhēng)”,我收到很多父母的留言,印象最深的是一位父親的留言:“家有青春期的孩子,就像身...
    我的心靈大白閱讀 1,684評(píng)論 0 4
  • 心累,也許是壓力大??粗鴦e人接二連三地開單,還自己依然沒業(yè)績(jī),不免會(huì)著急。什么時(shí)候自己才能開單,如果一直不開單,自...
    流浪癡人閱讀 383評(píng)論 2 1
  • 文/沐伊 圖/花瓣網(wǎng) 總有一天,你不再需要轟轟烈烈的愛情,不再需要驚天地泣鬼神的誓言,你只想有那么一個(gè)人能夠一直...
    沐伊520閱讀 523評(píng)論 0 1

友情鏈接更多精彩內(nèi)容