1. 程式人生 > >Android開發之RecyclerView新增頭部和底部

Android開發之RecyclerView新增頭部和底部

前言:我們在使用RecyclerView的過程中其實還是有很多問題的,前面提到的沒有預設的分割線,很是讓人蛋疼啊,但現在有出了個問題,不能新增頭部和底部,這一度讓我認為這貨還是沒有最愛的ListView好用啊,哈哈,既然谷歌出來了,我們就要使用,沒有頭和腳那我們就給他造出頭和腳,可以仿照ListView那樣優雅的實現。

翔神封裝的過於強大,對於我這樣的小白來說只能是以後學習的物件,大家不妨看一下我的大笑大笑大笑

分析:如果想自己動手也封裝一個頭部和尾部,那只有參考ListView是如何封裝的,大家看一下ListView的關鍵程式碼,是不是就明白了很多

ListView.addHeaderView(){
	 if (mAdapter != null) {
            if (!(mAdapter instanceof HeaderViewListAdapter)) {
                mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, mAdapter);
            }
};
ListView.setAdapter(){
	if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) {
            mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter);
        } else {
            mAdapter = adapter;
        }
}

所以我們也要封裝一個類似於HeaderViewListAdapter這樣的Adapter(具體細節看程式碼註釋):
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.Adapter;
import android.view.View;
import android.view.ViewGroup;

import java.util.ArrayList;

/**
 * Created by Fly on 2017/5/15.
 */

public class WrapRecyclerViewAdapter extends RecyclerView.Adapter {
    private Adapter mAdapter;
    private ArrayList<View> mHeaderViewInfos;
    private ArrayList<View> mFooterViewInfos;

    public WrapRecyclerViewAdapter(ArrayList<View> headerViewInfos, ArrayList<View> footerViewInfos, Adapter adapter) {
        mAdapter = adapter;

        if (headerViewInfos == null) {
            mHeaderViewInfos = new ArrayList<View>();
        } else {
            mHeaderViewInfos = headerViewInfos;
        }

        if (footerViewInfos == null) {
            mFooterViewInfos = new ArrayList<View>();
        } else {
            mFooterViewInfos = footerViewInfos;
        }
    }

    @Override
    public int getItemCount() {
        if (mAdapter != null) {
            return getFootersCount() + getHeadersCount() + mAdapter.getItemCount();
        } else {
            return getFootersCount() + getHeadersCount();
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        //也要劃分三個區域
        int numHeaders = getHeadersCount();
        if (position < numHeaders) {//是頭部
            return;
        }
        //adapter body
        final int adjPosition = position - numHeaders;
        int adapterCount = 0;
        if (mAdapter != null) {
            adapterCount = mAdapter.getItemCount();
            if (adjPosition < adapterCount) {
                mAdapter.onBindViewHolder(holder, adjPosition);
                return;
            }
        }
    }

    @Override
    public int getItemViewType(int position) {
        //判斷當前條目是什麼型別的---決定渲染什麼檢視給什麼資料
        int numHeaders = getHeadersCount();
        if (position < numHeaders) {//是頭部
            return RecyclerView.INVALID_TYPE;
        }
        //正常條目部分
        // Adapter
        final int adjPosition = position - numHeaders;
        int adapterCount = 0;
        if (mAdapter != null) {
            adapterCount = mAdapter.getItemCount();
            if (adjPosition < adapterCount) {
                return mAdapter.getItemViewType(adjPosition);
            }
        }
        //footer部分
        return RecyclerView.INVALID_TYPE - 1;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //header
        if (viewType == RecyclerView.INVALID_TYPE) {
            return new HeaderViewHolder(mHeaderViewInfos.get(0));
        } else if (viewType == RecyclerView.INVALID_TYPE - 1) {//footer
            return new HeaderViewHolder(mFooterViewInfos.get(0));
        }
        return mAdapter.onCreateViewHolder(parent, viewType);
    }

    public int getHeadersCount() {
        return mHeaderViewInfos.size();
    }

    public int getFootersCount() {
        return mFooterViewInfos.size();
    }

    private static class HeaderViewHolder extends RecyclerView.ViewHolder {

        public HeaderViewHolder(View view) {
            super(view);
        }
    }
}

我們footerView和headerView的Adapter封裝好了,接下來肯定也要重新改造下RecyclerView這個類,打造能接收HeaderView和FooterView的RecyclerView:

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.View;

import java.util.ArrayList;

public class WrapRecyclerView extends RecyclerView {
    private ArrayList<View> mHeaderViewInfos = new ArrayList<View>();
    private ArrayList<View> mFooterViewInfos = new ArrayList<View>();
    private Adapter mAdapter;

    public WrapRecyclerView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void addHeaderView(View v) {
        mHeaderViewInfos.add(v);

        // Wrap the adapter if it wasn't already wrapped.
        if (mAdapter != null) {
            if (!(mAdapter instanceof WrapRecyclerViewAdapter)) {
                mAdapter = new WrapRecyclerViewAdapter(mHeaderViewInfos, mFooterViewInfos, mAdapter);
            }
        }
    }

    public void addFooterView(View v) {
        mFooterViewInfos.add(v);
        // Wrap the adapter if it wasn't already wrapped.
        if (mAdapter != null) {
            if (!(mAdapter instanceof WrapRecyclerViewAdapter)) {
                mAdapter = new WrapRecyclerViewAdapter(mHeaderViewInfos, mFooterViewInfos, mAdapter);
            }
        }
    }

    @Override
    public void setAdapter(Adapter adapter) {
        if (mHeaderViewInfos.size() > 0 || mFooterViewInfos.size() > 0) {
            mAdapter = new WrapRecyclerViewAdapter(mHeaderViewInfos, mFooterViewInfos, adapter);
        } else {
            mAdapter = adapter;
        }
        super.setAdapter(mAdapter);
    }
}

ok接下來新增完整佈局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.fly.rv02.MainActivity">

    <com.fly.rv02.WrapRecyclerView
        android:id="@+id/rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>

在程式碼中新增頭部和尾部:

View headerView = View.inflate(this, R.layout.header, null);
mRecyclerView.addHeaderView(headerView);

View footerView = View.inflate(this, R.layout.footer, null);
mRecyclerView.addFooterView(footerView);

兩個佈局過於簡單就不貼了,下面看效果:



大功告成,大家趕緊去嘗試一下吧!!!

相關推薦

Android開發RecyclerView新增頭部底部

前言:我們在使用RecyclerView的過程中其實還是有很多問題的,前面提到的沒有預設的分割線,很是讓人蛋疼啊,但現在有出了個問題,不能新增頭部和底部,這一度讓我認為這貨還是沒有最愛的ListView好用啊,哈哈,既然谷歌出來了,我們就要使用,沒有頭和腳那我們就給他造出頭

RecyclerView新增頭部底部

定義: 裝飾設計模式也稱包裝設計模式,用來動態的擴充套件物件的功能,也是繼承關係的的一種替代方案之一。 說個大白話就是,在不使用的繼承的方式下,採用裝飾設計模式可以擴充套件一個物件的功能,可以使一個物件變得越來越強大。 我們首先看下效果圖 我

Android開發RecyclerView的互動動畫(實現拖拽刪除)

做RecyclerView做相關的動畫效果的時候,用的最多的是v7包下的ItemTouchHelper類,這個類很強大,如有興趣的童鞋可以自行翻看原始碼,接下來我帶領大家實現RecyclerView相關的互動動畫。大家看下面的效果(拖拽和刪除): ------------

AndroidRecyclerView新增頭部尾部

之前我在GitHub上開源了一個可以實現RecyclerView列表分組的通用Adapter: 。也在部落格上寫了一篇專門介紹它的實現和使用的文章:《Android 可分組的RecyclerViewAdapter》。有一些朋友在看了我的博文和使用我的開源庫後,會

Android開發強制橫屏強制豎屏

強制豎屏設定 1.程式碼在Activity的onResume方法中新增如下程式碼 @Override protected void onResume() { /** *

Android開發基本控制元件詳解四種佈局方式

Android中的控制元件的使用方式和iOS中控制元件的使用方式基本相同,都是事件驅動。給控制元件新增事件也有介面回撥和委託代理的方式。今天這篇部落格就總結一下Android中常用的基本控制元件以及佈局方式。說到佈局方式Android和iOS還是區別挺大的,在iOS中有F

RecyclerView新增頭部尾部最簡單的實現方式

@Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType ==

Android開發RecyclerView實現流式佈局

RecyclerView是什麼? RecycleView的出現, 替代了ListView, 沒了OnitemClickListener,; LayoutManager負責計算佈局; Adapter 負責適配,還增加了ViewHolder;RecycleView

Android開發RecyclerView的使用全解

轉自 http://blog.csdn.net/dmk877/article/details/50816933 之後,谷歌公司推出了RecylerView控制元件,RecylerView,我想看到一個新名詞後大部分人會首先發出一個疑問,recylervie

RecyclerView新增頭部腳部的UI控制元件:Bookends

Bookends會封裝傳遞給它的adapter。 其工作原理是在 getItemViewType()的返回值中新增額外的view item型別,將addHeader() 和 addFooter()提供的view對映為頭部和腳部。 使用這個類有如下的限制: 只對單列的列表有效(比如使用Linear

Android開發RecyclerView(一)初步使用

首先要感謝前面的大佬們的總結,給了我站在巨人肩膀上的機會。文中有不對的地方還望大佬指出,如有大佬覺的侵權的地方還望指出,鄙人將以最快速度修改!好了,話不多少了,開始開車! 第一步:匯入RecyclerView compile 'com.android.support:re

RecycleView新增頭部底部

實現思路 在Adapter中定義不同的佈局和item狀態 判斷item的狀態,載入對應的佈局檔案 例項程式碼 在gradle中新增下面的依賴 compile 'com.android.support:recyclerview-v7:23.1.

RecyclerView新增頭部尾部

為RecyclerView新增頭部和底部 第一步1 需要定義一個Adapter,繼承自RecyclerView.Adapter HeaderAndFooterWrapper<

Android開發呼叫相機拍照呼叫系統相簿

Android應用程式中呼叫相機進行拍照和選擇相簿中的照片是經常會使用到的,那麼我們就來實現以下這個功能。 首先建立一個工程CameraTest,佈局檔案一個ImageView,兩個Button。 <?xml version="1.0" en

Android開發實現滑動RecyclerView,浮動按鈕的顯示隱藏(一)

本篇部落格,主要講解了滑動RecyclerView實現FloatingActionButton的顯示和隱藏的動畫。 -------------------------------分割線----------------------------- 效果圖展示: -------

Android 開發Windows環境下Android Studio安裝使用教程(圖文詳細步驟)

9.png 虛擬機 jdk版本 編寫 clip 開發平臺 集成開發 arc 電腦安裝 鑒於谷歌最新推出的Android Studio備受開發者的推崇,所以也跟著體驗一下。 一、介紹Android Studio Android Studio 是一個Android

HTML5 開發APP(頭部底部選項卡)

技術 開發 方法 eat 激活 default 底部 top doc 我們開發app有一定固定的樣式,比如頭部和底部選項卡部分就是公共部分就比如我在做的app進來的主頁面就像圖片顯示的那樣 我們該怎麽實現呢,實現我們應該建一個主頁面index.html,然後建五個子頁面

Android開發深入理解泛型extendssuper的區別

我想 lis dataset 文檔 cnblogs extend 擦除 選擇 提前 摘要: 什麽是泛型?什麽是擦除邊界?什麽是上界限定或下界限定(子類型限定或超類型限定)?什麽是類型安全?泛型extends關和super關鍵字結合通配符?使用的區別,兩種泛型在實際Andro

Android開發漫漫長途 XIV——RecyclerView

計算 來看 就是 們的 anim nullable 源碼 添加 問題 該文章是一個系列文章,是本人在Android開發的漫漫長途上的一點感想和記錄,我會盡量按照先易後難的順序進行編寫該系列。該系列引用了《Android開發藝術探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ

Android開發漫漫長途 XVI——ListView與RecyclerView項目實戰

列表 系列 緩存 廣泛 原理 前言 評論 request 功能點 該文章是一個系列文章,是本人在Android開發的漫漫長途上的一點感想和記錄,我會盡量按照先易後難的順序進行編寫該系列。該系列引用了《Android開發藝術探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》中