万能的RecyclerView适配器(可添加头)
2016-05-27 18:07
344 查看
相对来说,RecyclerView 的适配器比ListView的适配器复杂许多,下面封装了一个万能的适配器,使用的时候直接以内部类的形式就行了,非常方便。
代码很简单,就不赘述了!
再附上一分ViewHolder
代码很简单,就不赘述了!
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); } }
相关文章推荐
- gridview安卓实现单行多列横向滚动
- gridview安卓实现单行多列横向滚动
- Spring回滚事务机制与创建数组的语法,Object[] params = new Object[]{值}
- Spring RestTemplate详解
- 系统调用服务号 linux 2.6.32
- C#中的引用传递和值传递。
- Spring中的设计模式
- java面向对象_构造器
- C51单片机-串行口2-蓝牙模块-应用例程
- localhost:8080 自动变成了 IP 地址
- javascript 面向对象基础(三)面向对象的常用属性和方法
- Java综合项目分析
- HDU 1258 Sum It Up(DFS)
- 新浪 SDK编码规范
- 从病毒到AU3编程语言
- GitHub的使用
- open falcon dashboard 安装
- Django进阶
- 谷歌设计规范摘录-字体
- backpackII