RecyclerView 添加 Footer and Header

學習了 RecyclerView 的使用后狗超,發(fā)現(xiàn) 每個顯示 ItemView 的高度寬度瞳腌,以及款式都是一樣的,很是單調(diào)哎垦,于是就想著如果能兩種不同的 ItemView 間隔著顯示就好了囱嫩,或者說如果頭部和底部能區(qū)別于 ItemView就好了。

首先漏设,看看添加 頭部和底部的效果圖

20160511142236439.png

靜下來想想這樣的效果并不難實現(xiàn)墨闲,在 RecyclerView 中我們的視圖都是通過RecyclerView.ViewHolder來給我提供子視圖的,而這個 ViewHolder 的創(chuàng)建是由 RecyclerView.Adapter 中的onCreateViewHolder() 方法控制的,來仔細看看這個方法

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 

咦郑口,這個 viewType是什么東西八鸺蟆?實際上這個 viewType是我們可以改動的潘酗,通過 getItemViewType() 這個方法杆兵,這也就意味著,我們可以控制 ViewHolder 的創(chuàng)建仔夺,那么這樣這個效果就容易實現(xiàn)了琐脏。

首先,我們創(chuàng)建三個 RecyclerView.ViewHolder缸兔,分別命名為 HeaderHolder, ContentHolderFooterHolder日裙,他們的實現(xiàn)實際上是一樣的,除了 TextView 的命名不一樣惰蜜。來看看這三個類

public class HeaderHolder extends RecyclerView.ViewHolder {

    public TextView mHeaderText;

    public HeaderHolder(View itemView) {
        super(itemView);
        mHeaderText = (TextView) itemView.findViewById(R.id.tv_header);

    }
}

public class ContentHolder extends RecyclerView.ViewHolder {
    public TextView mContentText;

    public ContentHolder(View itemView) {
        super(itemView);
        mContentText = (TextView) itemView.findViewById(R.id.tv_content);
    }
}

public class FooterHolder extends RecyclerView.ViewHolder {

    public TextView mFooterText;

    public FooterHolder(View itemView) {
        super(itemView);
        mFooterText = (TextView) itemView.findViewById(R.id.tv_footer);
    }
}

下面就是 RecyclerView.Adapter 的實現(xiàn)了昂拂,先來看看具體代碼

public class CustomAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    public static final int HEADER_ITEM = 0;
    public static final int CONTENT_ITEM = 1;
    public static final int FOOTER_ITEM = 2;
    public List<String> mDatas;
    private Context mContext;
    private LayoutInflater mInflater;

    private int mHeaderCount = 1;
    private int mFooterCount = 1;

    private String mHeaderText = "Header";
    private String mFooterText = "Footer";

    public CustomAdapter(Context context, List<String> datas) {
        mContext = context;
        mDatas = datas;
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == HEADER_ITEM) {
            return new HeaderHolder(mInflater.inflate(R.layout.recycler_header, parent, false));
        } else if (viewType == CONTENT_ITEM) {
            return new ContentHolder(mInflater.inflate(R.layout.recycler_content, parent, false));
        } else {
            return new FooterHolder(mInflater.inflate(R.layout.recycler_footer, parent, false));
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof HeaderHolder) {
            ((HeaderHolder) holder).mHeaderText.setText(mHeaderText);
        } else if (holder instanceof FooterHolder) {
            ((FooterHolder) holder).mFooterText.setText(mFooterText);
        } else if (holder instanceof ContentHolder) {
            ((ContentHolder) holder).mContentText.setText(mDatas.get(position - mHeaderCount));
        }
    }

    @Override
    public int getItemViewType(int position) {

        int count = mDatas.size();
        if (mHeaderCount != 0 && position < mHeaderCount) return HEADER_ITEM;
        else if (mFooterCount != 0 && position >= (mHeaderCount + count)) return FOOTER_ITEM;
        else return CONTENT_ITEM;
    }

    @Override
    public int getItemCount() {
        return mDatas.size() + mHeaderCount + mFooterCount;
    }

    public void setFooterText(String footerText) {
        mFooterText = footerText;
    }

    public void setHeaderText(String headerText) {
        mHeaderText = headerText;
    }

    public void removeFooter() {
        mFooterCount = 0;
    }

    public void removeHeader() {
        mHeaderCount = 0;
    }
}

相信有了前面的分析,讓你看懂以上代碼并不困難抛猖,但是需要注意的是

if (holder instanceof ContentHolder) {
            ((ContentHolder) holder).mContentText.setText(mDatas.get(position - mHeaderCount));
}

注意這段代碼中的 get方法格侯,不是 get(position) ,因為有了 mHeaderCount 的存在财著,如果還是設置成get(position) 會出現(xiàn)數(shù)組下標越界錯誤联四,這里設置成 get(position - mHeaderCount)) 也是為了控制添加和移除 Header 的。

好了撑教,相信如果以上效果你能實現(xiàn)朝墩,那么你也就能實現(xiàn)我們一開始說的 間隔 ItemView不同布局的問題了,只需要在 getItemViewType() 方法中進行奇偶判斷伟姐,返回不同的 viewType 就可以了收苏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亿卤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鹿霸,更是在濱河造成了極大的恐慌怠噪,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杜跷,死亡現(xiàn)場離奇詭異,居然都是意外死亡矫夷,警方通過查閱死者的電腦和手機葛闷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來双藕,“玉大人淑趾,你說我怎么就攤上這事∮桥悖” “怎么了扣泊?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嘶摊。 經(jīng)常有香客問我延蟹,道長,這世上最難降的妖魔是什么叶堆? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任阱飘,我火速辦了婚禮,結(jié)果婚禮上虱颗,老公的妹妹穿的比我還像新娘沥匈。我一直安慰自己,他們只是感情好忘渔,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布高帖。 她就那樣靜靜地躺著,像睡著了一般畦粮。 火紅的嫁衣襯著肌膚如雪散址。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天宣赔,我揣著相機與錄音爪飘,去河邊找鬼。 笑死拉背,一個胖子當著我的面吹牛师崎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播椅棺,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼犁罩,長吁一口氣:“原來是場噩夢啊……” “哼齐蔽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起床估,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤含滴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后丐巫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谈况,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年递胧,在試婚紗的時候發(fā)現(xiàn)自己被綠了碑韵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡缎脾,死狀恐怖祝闻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情遗菠,我是刑警寧澤联喘,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站辙纬,受9級特大地震影響豁遭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贺拣,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一堤框、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纵柿,春花似錦蜈抓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渊跋,卻和暖如春腊嗡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拾酝。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工燕少, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蒿囤。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓客们,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子底挫,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

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