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