Recycleview实现顶部添加headerview

本文介绍了如何在Recycleview中实现类似ListView的addheaderview功能。虽然Recycleview更灵活且内存优化出色,但缺少了这个便捷方法。通过自定义Adapter和设置不同ViewType,可以实现Header的添加。此外,文中推荐了一个框架,帮助快速解决这个问题。

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

你还在为recycleview移除了listview的addheaderview方法而发愁??recycleview虽然是listview和gridview的升级版,使用更加方便灵活。内存方面优化也是非常突出的。但是丢弃了很多以前我们在listview里面使用非常顺手并且常用的方法。开始遇到时,真的很想吐槽一下,但是研究一下,原来google把这些方法都留给我们自己去写了,在recycleview的adapter里面可以根据不同的viewtype添加不同的布局,也是非常灵活的。但还是不爽,为什么要自己写??后来发现一个很好的框架,实现添加headerview !!!分分钟搞定,话不多说了,直接上代码


这里顺便提供一个万能adapter:

package com.yjtc.cbg.addheaderndfootrecycleview;

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.AbstractCollection;
import java.util.Iterator;
import java.util.List;

/**
 * Created by chenboge on 16/2/10.
 */
public abstract class BaseAdapter<T, H extends BaseViewHolder> extends RecyclerView.Adapter<BaseViewHolder> {

    protected Context mContext;
    protected List<T> mDatas;
    private LayoutInflater mInflater;
    private onItemClickListener monItemClickListener;
    public int itemViewID;

    public BaseAdapter(Context mContext, List<T> mDatas, int itemViewID) {
        this.mContext = mContext;
        this.mDatas = mDatas;
        this.itemViewID = itemViewID;
        mInflater = LayoutInflater.from(mContext);
    }

    public T getItem(int position) {
        return mDatas.get(position);
    }

    public interface onItemClickListener {
        void onClick(View view, int position);
    }

    public void setOnItemClickListener(onItemClickListener itemClickListener) {
        this.monItemClickListener = itemClickListener;
    }

    @Override
    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View mView = null;
        mView = mInflater.inflate(itemViewID, null, false);
        return new BaseViewHolder(mView, monItemClickListener);
    }

    @Override
    public void onBindViewHolder(BaseViewHolder holder, int position) {
        bindData(holder, position);
    }

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


    public List<T> getDatas() {
        return mDatas;
    }


    public void AddData(List<T> datas) {

        AddData(0, datas);
    }

    public void AddData(int position, List<T> list) {

        if (list != null && list.size() > 0) {

            for (T t : list) {
                mDatas.add(position, t);
                notifyItemInserted(position);
            }

        }

    }


    public void removeItem(T t) {

        int position = mDatas.indexOf(t);
        mDatas.remove(position);
        notifyItemRemoved(position);
    }

    public void ClearData() {

        if (mDatas == null || mDatas.size() <= 0)
            return;

        for (Iterator it = mDatas.iterator(); it.hasNext(); ) {

            T t = (T) it.next();
            int position = mDatas.indexOf(t);
            it.remove();
            notifyItemRemoved(position);
        }
    }


    public void refreshData(List<T> data) {
        ClearData();
        if (data != null && data.size() > 0) {
            for (int i = 0; i < data.size(); i++) {
                mDatas.add(i, data.get(i));
                notifyItemInserted(i);
            }
        }
    }

    public void loadMoreData(List<T> data) {
        if (data != null && data.size() > 0) {
            //ClearData();
            int begin = mDatas.size();
            for (int i = 0; i < data.size(); i++) {
                mDatas.add(data.get(i));
                notifyItemInserted(begin + i);
            }
        }
    }

    abstract void bindData(BaseViewHolder holder, int position);
}


使用的viewholder是关键:

package com.yjtc.cbg.addheaderndfootrecycleview;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.IdentityHashMap;

/**
 * Created by chenboge on 16/2/10.
 */
public class BaseViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

    private SparseArray<View> mViews;
    private Context mContext;
    private BaseAdapter.onItemClickListener monItemClickListener;

    public BaseViewHolder(View itemView, BaseAdapter.onItemClickListener onItemClickListener) {
        super(itemView);
        mViews = new SparseArray<>();
        this.monItemClickListener = onItemClickListener;
        itemView.setOnClickListener(this);
    }

    private <T extends View> T findView(int id) {
        View view = mViews.get(id);
        if (view == null) {
            view = itemView.findViewById(id);
            mViews.put(id, view);
        }
        return (T) view;
    }

    public View getView(int id) {
        return findView(id);
    }

    public TextView getTextView(int id) {
        return findView(id);
    }

    public ImageView getImageView(int id) {
        return findView(id);
    }

    public Button getButton(int id) {
        return findView(id);
    }

    @Override
    public void onClick(View v) {
        if(monItemClickListener!=null) {
            monItemClickListener.onClick(v, getLayoutPosition());
        }
    }
}


接下来讲addheaderview最关键的部分了,小伙伴们看好了--
首先添加依赖库:
compile 'com.bartoszlipinski.recyclerviewheader:library:1.2.0'
compile 'com.android.support:recyclerview-v7:23.0.1'

接下来实现布局文件编写:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center_horizontal|top" />


    <com.bartoszlipinski.recyclerviewheader.RecyclerViewHeader
        android:id="@+id/header"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:layout_gravity="center_horizontal|top">

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:src="@mipmap/ic_launcher"/>

    </com.bartoszlipinski.recyclerviewheader.RecyclerViewHeader>

</FrameLayout>
最后只需要在代码中设置完adapter之后,调用attachto方法即可实现了
核心代码就这么点:
header = (RecyclerViewHeader) findViewById(R.id.header);
recyclerView = (RecyclerView) findViewById(R.id.recycler);
mAdapter = new MyAdapter(this, mDatas, R.layout.template_text);
recyclerView.setAdapter(mAdapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
header.attachTo(recyclerView, true);
如果你这样做了,恭喜你,集成成功了!!!







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值