看了一下博客目录,已经有好几篇博客是关于RecyclerView
的,不过对于这么一款强大的控件,我还是要再写一篇博客来学习一下,这篇博客的主题是《为RecyclerView添加header》,当然在看完这篇博客后,相信添加Footer你也应该能够学会。话说在这么多新控件中为何RecyclerView
备受开发者的喜爱?这还是因为在Android发展到今天基本上还没有像RecyclerView
这么灵活的一个玩意,鉴于他的灵活以及强大,很多人(包括我)已经开始抛弃ListView
和GridView
转为RecyclerView
了,再使用过RecyclerView
和被善变的需求折磨后,我相信会有越来越多的人转到RecyclerView
的使用上。
问题
好了,废话不多说了,这篇博客我们要解决的问题有:
- 如何为RecyclerView添加Header
- 如何让Header适配各种LayoutManager
- 在有Header的情况下,我们的分割线该怎么画
- 作为一个懒惰的程序员,如何将这些做到最简便
如果为RecyclerView添加Header
大家在使用ListView
的时候可以很轻松的添加headers, 但是不知道大家发现没有,RecyclerView
和各种LayoutManager
都没有哪个方法是为添加header而设立的,这个时候我们就开始思考如何为RecyclerView
添加header了。 这里我们的解决方案和网上你能搜到的大多数方案一样,是通过控制Adapter
的itemType
来设置的,思路就是根据不同的itemType去加载不同的布局。
/**
* Created by qibin on 2015/11/5.
*/
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public static final int TYPE_HEADER = 0;
public static final int TYPE_NORMAL = 1;
private ArrayList<String> mDatas = new ArrayList<>();
private View mHeaderView;
private OnItemClickListener mListener;
public void setOnItemClickListener(OnItemClickListener li) {
mListener = li;
}
public void setHeaderView(View headerView) {
mHeaderView = headerView;
notifyItemInserted(0);
}
public View getHeaderView() {
return mHeaderView;
}
public void addDatas(ArrayList<String> datas) {
mDatas.addAll(datas);
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
if(mHeaderView == null) return TYPE_NORMAL;
if(position == 0) return TYPE_HEADER;
return TYPE_NORMAL;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if(mHeaderView != null && viewType == TYPE_HEADER) return new Holder(mHeaderView);
View layout = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
return new Holder(layout);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
if(getItemViewType(position) == TYPE_HEADER) return;
final int pos = getRealPosition(viewHolder);
final String data = mDatas.get(pos);
if(viewHolder instanceof Holder) {
((Holder) viewHolder).text.setText(data);
if(mListener == null) return;
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onItemClick(pos, data);
}
}