Android零基础入门第68节:完善RecyclerView,添加首尾视图

本文介绍如何在RecyclerView中添加首尾视图,对比ListView的添加方法,并详细解析RecyclerView.Adapter中的相关方法,如getItemViewType、isHeaderView和isBottomView。通过创建布局文件和修改Adapter代码,实现RecyclerView的首尾视图加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   在之前学习ListView的时候,有学习过如何给ListView添加列表头和列表尾。但是通过近几期的学习,发现RecyclerView是一个比ListView更加强大和灵活的组件,今天一起来学习如何给RecyclerView添加首尾视图。

    首先来简单回顾一下ListView是如何添加列表头和列表尾的,先定义好首尾视图,然后通过addHeaderView和addFooterView两个方法来加载即可,相对来说比较简单。然后在RecyclerView中并未发现类似的方法,那么应该如何为其添加首尾视图呢?

    可能一些细心的同学已经发了RecyclerView.Adapter中还有几个方法没有被重写过,就先来看看是哪几个方法:

  • getItemViewType:判断当前item类型。

  • isHeaderView:判断当前item是否是HeadView。

  • isBottomView:判断当前item是否是FooterView。

    同时可以看到在onCreateViewHolder方法里面带一个viewType参数,实际上onCreateViewHolder方法就是根据viewType来判断具体item是列表项、HeaderView或FooterView,然后来分别加载不同的布局文件。

    接下来继续使用再上一期的案例来学习如何给RecyclerView添加首尾视图。

    在main/res/layout/目录下创建recyclerview_header.xml文件,在其中填充如下代码片段:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="50dp">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Header View"
        android:textSize="20sp"
        android:gravity="center"/>
</LinearLayout>

    继续新建一个recyclerview_footer.xml文件,在其中填充如下代码片段:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="50dp">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Footer View"
        android:textSize="20sp"
        android:gravity="center"/>
</LinearLayout>

    然后修改RecyclerViewAdapter文件,在getItemViewType方法里面判断了当前Item的类型,然后在onCreateViewHolder跟据item的类型分别加载不同的布局以实现HeaderView和FooterView。修改后的RecyclerViewAdapter代码如下:

package com.jinyu.cqkxzsxy.android.advancedviewsample.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.jinyu.cqkxzsxy.android.advancedviewsample.R;

import java.util.ArrayList;

/**
 * @创建者 鑫鱻
 * @描述 Android零基础入门到精通系列教程
 * 首发微信公众号分享达人秀(ShareExpert)
 */
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    //item类型
    public static final int ITEM_TYPE_HEADER = 0;
    public static final int ITEM_TYPE_CONTENT = 1;
    public static final int ITEM_TYPE_BOTTOM = 2;

    private ArrayList<String> mDatas = null;
    private LayoutInflater mInflater = null;
    private OnItemClickListener mOnItemClickListener = null;
    private OnItemLongClickListener mOnItemLongClickListener = null;

    public RecyclerViewAdapter(Context context, ArrayList<String> datas) {
        this.mDatas = datas;
        this.mInflater = LayoutInflater.from(context);
    }

    //内容长度
    public int getContentItemCount(){
        return mDatas == null ? 0 : mDatas.size();
    }

    //判断当前item是否是HeadView
    public boolean isHeaderView(int position) {
        return 0 == position;
    }

    //判断当前item是否是FooterView
    public boolean isBottomView(int position) {
        return position == (getContentItemCount() + 1);
    }

    //判断当前item类型
    @Override
    public int getItemViewType(int position) {
        if (0 == position) {
            //头部View
            return ITEM_TYPE_HEADER;
        } else if (getContentItemCount() + 1 == position) {
            //底部View
            return ITEM_TYPE_BOTTOM;
        } else {
            //内容View
            return ITEM_TYPE_CONTENT;
        }
    }

    // 创建新View,被LayoutManager所调用
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        RecyclerView.ViewHolder vewHolder = null;
        View view = null;
        if(ITEM_TYPE_HEADER == viewType) {
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值