Recycleview实现顶部添加headerview

来源:互联网 发布:程序员的数学全套pdf 编辑:程序博客网 时间:2024/06/06 17:31

你还在为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);
如果你这样做了,恭喜你,集成成功了!!!




2 0
原创粉丝点击