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
- Recycleview实现顶部添加headerview
- 如何优雅的实现recycleview加入顶部headerview,实现一起滑动效果
- Android RecycleView添加HeaderView宽度不能撑满屏幕问题
- RecycleView不同类型Item&添加HeaderView&条目点击事件
- RecycleView添加HeaderView宽度不能撑满,第一次加载HeaderView的子控件获取不到焦点
- 支持上下拉刷新的RecycleView,基于androidPullToRefresh,添加RecycleView HeaderView
- ListView添加headerview实现连动滑动
- RecycleView 实现瀑布流 添加分隔
- RecycleView实现瀑布流添加分隔线
- ListView源码分析之添加HeaderView(或FooterView)实现原理
- RecyclerView实现流式布局并添加headerview、footerview
- 为GridView添加HeaderView的简单实现方法
- 给ListView添加HeaderView
- 为GridView添加HeaderView
- 为GridView添加HeaderView
- 为GridView添加HeaderView
- 为GridView添加HeaderView
- 为GridView添加HeaderView
- ArrayList和LinkedList的区别
- Swift设计模式之策略模式
- XCode编译器介绍
- unity里面动态的替换shader
- 目标赋予生命的意义和目的
- Recycleview实现顶部添加headerview
- Caused by: java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut poin_
- Linux常用命令
- Swift设计模式之备忘录模式
- java实现堆的操作(建堆,插入,删除)
- php laravel学习总结
- 怎样才能不下载使用一些前端类库
- 常用C#字符串函数大全
- [BZOJ1143][CTSC2008]祭祀river(floyed+二分图匹配)