万能的RecyclerView适配器(可添加头)
来源:互联网 发布:太把自己当回事 知乎 编辑:程序博客网 时间:2024/05/23 02:26
相对来说,RecyclerView 的适配器比ListView的适配器复杂许多,下面封装了一个万能的适配器,使用的时候直接以内部类的形式就行了,非常方便。
代码很简单,就不赘述了!
import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.StaggeredGridLayoutManager;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import com.framework.jcodecraeer.base.listener.OnItemClickListener;import com.framework.jcodecraeer.base.listener.OnItemLongClickListener;import java.util.ArrayList;import java.util.List;/** * Created by lzp on 2016/5/27. */public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<RecyclerHolder> { public static final int TYPE_HEADER = 0; public static final int TYPE_NORMAL = 1; protected List<T> itemList = new ArrayList<>(); private View mHeaderView; private OnItemClickListener mListener; private OnItemLongClickListener mLongListener; public void setOnItemClickListener(OnItemClickListener li) { mListener = li; } public void setOnItemLongClickListener(OnItemLongClickListener li){ mLongListener = li; } public BaseRecyclerAdapter(){ } public BaseRecyclerAdapter(List<T> datas){ itemList.addAll(datas); } public void setHeaderView(View headerView) { mHeaderView = headerView; notifyItemInserted(1); } public View getHeaderView() { return mHeaderView; } public void addItems(T[] datas){ for (T data : datas){ itemList.add(data); } notifyDataSetChanged(); } public void addItems(List<T> datas) { itemList.addAll(datas); notifyDataSetChanged(); } public void removeItem(int position){ itemList.remove(position); notifyItemRemoved(position); } public void setItems(List<T> datas){ itemList.clear(); itemList.addAll(datas); notifyDataSetChanged(); } public void clearItems(){ itemList.clear(); notifyDataSetChanged(); } public T getItem(int position){ return itemList.get(position); } /** * 判断数据是否为空 * * @return 为空返回true,不为空返回false */ public boolean isEmpty() { return itemList.isEmpty(); } @Override public int getItemViewType(int position) { if(mHeaderView == null) return TYPE_NORMAL; if(position == 0) return TYPE_HEADER; return TYPE_NORMAL; } @Override public RecyclerHolder onCreateViewHolder(ViewGroup parent, final int viewType) { if(mHeaderView != null && viewType == TYPE_HEADER) return new HeaderHolder(mHeaderView); View itemView = LayoutInflater.from(parent.getContext()).inflate(itemViewId(), parent, false); final RecyclerHolder recyclerHolder = new RecyclerHolder(itemView); if(mListener != null){ recyclerHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mListener.onItemClick(recyclerHolder); } }); } if(mLongListener != null){ recyclerHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { mLongListener.onItemLongClick(recyclerHolder); return true; } }); } return recyclerHolder; } @Override public void onBindViewHolder(final RecyclerHolder viewHolder, int position) { if(getItemViewType(position) == TYPE_HEADER){ onBindHeader(((HeaderHolder)viewHolder)); return; } final int pos = getRealPosition(viewHolder); final T data = itemList.get(pos); onBind(viewHolder, pos, data); } @Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); RecyclerView.LayoutManager manager = recyclerView.getLayoutManager(); if(manager instanceof GridLayoutManager) { final GridLayoutManager gridManager = ((GridLayoutManager) manager); gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { return getItemViewType(position) == TYPE_HEADER ? gridManager.getSpanCount() : 1; } }); } } @Override public void onViewAttachedToWindow(RecyclerHolder holder) { super.onViewAttachedToWindow(holder); ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams(); if(lp != null && lp instanceof StaggeredGridLayoutManager.LayoutParams) { StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp; p.setFullSpan(holder.getLayoutPosition() == 0); } } public int getRealPosition(RecyclerHolder holder) { int position = holder.getLayoutPosition(); return mHeaderView == null ? position : position -1; } @Override public int getItemCount() { return mHeaderView == null ? itemList.size() : itemList.size()+1; } public abstract int itemViewId(); public void onBindHeader(HeaderHolder viewHolder){ } public abstract void onBind(RecyclerHolder viewHolder, int RealPosition, T data); public class HeaderHolder extends RecyclerHolder { public HeaderHolder(View itemView) { super(itemView); } }}
再附上一分ViewHolder
/** * Created by lzp on 2016/5/27. */public class RecyclerHolder extends RecyclerView.ViewHolder { /** * 用于存储当前item当中的View */ private SparseArray<View> mViews; public RecyclerHolder(View itemView) { super(itemView); mViews = new SparseArray<>(); } public <T extends View> T findView(int ViewId) { View view = mViews.get(ViewId); //集合中没有,则从item当中获取,并存入集合当中 if (view == null) { view = itemView.findViewById(ViewId); mViews.put(ViewId, view); } return (T) view; } /** * 根据id得到TextView * * @return */ public TextView getTextView(int viewId) { return findView(viewId); } /** * 根据id得到ImageView * * @return */ public ImageView getImageView(int viewId) { return findView(viewId); } /** * 根据id得到Button * * @return */ public Button getButton(int viewId) { return findView(viewId); } /** * 根据id得到RadioButton * * @return */ public RadioButton getRadioButton(int viewId) { return findView(viewId); } /** * 根据id得到CheckBox * * @return */ public CheckBox getCheckBox(int viewId) { return findView(viewId); } /** * 根据id得到ImageButton * * @return */ public ImageButton getImageButton(int viewId) { return findView(viewId); } /** * 根据id得到ImageButton * * @return */ public EditText getEditText(int viewId) { return findView(viewId); } /** * 根据id设置View的隐藏和显示 * * @param viewId * @param visibility */ public void setVisibility(int viewId, int visibility) { findView(viewId).setVisibility(visibility); } /** * 根据id设置View的点击事件 * * @param viewId * @param l */ public void setOnClickListener(int viewId, View.OnClickListener l) { findView(viewId).setOnClickListener(l); }}
0 0
- 万能的RecyclerView适配器(可添加头)
- recyclerView万能适配器和多条目万能适配器,添加头和脚
- recyclerView 的万能适配器
- RecyclerView的万能适配器
- RecyclerView万能适配器加强版———可选择添加头和尾(含点击事件)
- 打造RecyclerView的万能适配器
- RecyclerView 万能适配器的抽取
- PowerfulRecyclerViewAdapter:一种RecyclerView的万能适配器实现
- 万能RecyclerView的数据适配器BaseRecyclerViewAdapterHelper
- 万能RecyclerView适配器
- 为RecyclerView打造万能适配器
- 万能适配器 listview gridview RecyclerView
- Android打造万能适配器--RecyclerView
- Databinding打造RecyclerView万能适配器
- Android 推荐几款好用的开源作品(二)之万能RecyclerView适配器
- Android 轻量级万能适配器,通吃所有的 AbsListView、RecyclerView
- Android 轻量级万能适配器,通吃所有的 AbsListView、RecyclerView
- 属于RecyclerView的万能适配器Adapter和ViewHolder
- GitHub的使用
- javascript 面向对象基础(三)面向对象的常用属性和方法
- C51单片机-串行口2-蓝牙模块-应用例程
- Spring RestTemplate详解
- Spring回滚事务机制与创建数组的语法,Object[] params = new Object[]{值}
- 万能的RecyclerView适配器(可添加头)
- 为Qtcreator 编译的程序添加管理员权限
- 第十四周项目—阅读并运行程序,解释程序执行得到的结果(2)
- 自定义之类微信底部渐变栏
- php编程安全指南
- 20位活跃在Github上的国内技术大牛
- torch学习
- Android Studio 混淆代码
- Apache服务器最新版下载、安装及配置(win版