Android给RecyclerView添加头(Header)和尾(Footer)和分标题(Title)——最简单的两种方法

给RecyclerView添加头和尾的方法很多,这里写两种最简单的方法。


1.控制布局 显隐

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:gravity="center"
        android:visibility="gone"
        android:text="这是子标题栏"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp">

        <ImageView
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:background="@mipmap/ic_launcher" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="我心飞翔" />

    </LinearLayout>
</LinearLayout>

这里把上面那个TextView作为标题栏,只不过是隐藏的(android:visibility="gone"),当你想要加载的时候,把他设置为visible即可


代码

int i = 0;

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
        ViewHolder holder = new ViewHolder(view);

        i++;
//        方法1
        if (i == 5) {
            ViewGroup vg = (ViewGroup) holder.itemView;
            TextView v = (TextView) vg.getChildAt(0);

            v.setVisibility(View.VISIBLE);

            v.setText("A");
            v.setTextColor(Color.RED);
        }

        if (i == 10) {
            ViewGroup vg = (ViewGroup) holder.itemView;
            TextView v = (TextView) vg.getChildAt(0);

            v.setVisibility(View.VISIBLE);

            v.setText("B");
            v.setTextColor(Color.RED);
        }
因为这个oncreateViewHolder会执行很多很多次,对应item的个数。所以我们选择在i=5的时候,和10的时候,添加了标题。


效果图

Android给RecyclerView添加头(Header)和尾(Footer)和分标题(Title)——最简单的两种方法


方法2

可以不用对布局进行添加这么一个隐藏的选项,直接新建一个textview添加进去即可,不过要添加布局参数

if (i == 5) {
    ViewGroup vg = (ViewGroup) holder.itemView;
    TextView tv = new TextView(mContext);
    tv.setText("A");
    tv.setTextColor(Color.RED);
    tv.setGravity(Gravity.CENTER);//文字居中

    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT,
            LinearLayout.LayoutParams.MATCH_PARENT
    );

    vg.addView(tv, lp);
}

效果图

Android给RecyclerView添加头(Header)和尾(Footer)和分标题(Title)——最简单的两种方法


全部代码

package com.hdu.a15058124.homework3;


import android.content.Context;
import android.graphics.Color;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import static android.R.id.list;
import static android.content.ContentValues.TAG;

public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {

    static class ViewHolder extends RecyclerView.ViewHolder {
        public ViewHolder(View view) {
            super(view);
        }
    }

    Context mContext = null;

    public Adapter(Context c) {
        mContext = c;
    }

    int i = 0;

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
        ViewHolder holder = new ViewHolder(view);

        i++;
//        方法1
//        if (i == 5) {
//            ViewGroup vg = (ViewGroup) holder.itemView;
//            TextView v = (TextView) vg.getChildAt(0);
//
//            v.setVisibility(View.VISIBLE);
//
//            v.setText("A");
//            v.setTextColor(Color.RED);
//        }
//
//        if (i == 10) {
//            ViewGroup vg = (ViewGroup) holder.itemView;
//            TextView v = (TextView) vg.getChildAt(0);
//
//            v.setVisibility(View.VISIBLE);
//
//            v.setText("B");
//            v.setTextColor(Color.RED);
//        }

        if (i == 5) {
            ViewGroup vg = (ViewGroup) holder.itemView;
            TextView tv = new TextView(mContext);
            tv.setText("A");
            tv.setTextColor(Color.RED);
            tv.setGravity(Gravity.CENTER);

            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.MATCH_PARENT
            );

            vg.addView(tv, lp);
        }

        return holder;
    }

    //绑定数据
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
    }

    @Override
    public int getItemCount() {
        return 30;
    }
}

请注意:以这种形式添加的分标题是依附于某一个item的,如果那个item被删了,这个分标题也无疑会被删了。所以更好的做法就是当i=5的时候,不用inflater的方法去加载view给holder,而是自己new出textview给holder,单独成立一个item。