为RecyclerView打造万能适配器
2016-04-05 19:45
323 查看
为了方便开发,减少代码量,打造万能的RecyclerView的适配器。
1、重写RecyclerView.Adapter<BaseViewHolder>,继承
2、重写RecyclerView.ViewHolder
自己刚写博客,表达能力有限,请多多支持
1、重写RecyclerView.Adapter<BaseViewHolder>,继承
package com.partjob.commonjar.base; import java.util.List; import android.content.Context; import android.support.v4.view.ViewPager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import com.partjob.commonjar.R; public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<BaseViewHolder> { protected Context context; protected List<T> mDatas; protected static final int TYPE_ITEM = 0; //普通的item protected static final int TYPE_HEADER = 1; //第一条item, protected static final int TYPE_FOOTER = 2; private boolean mEnablePullLoad = false; //添加尾 private boolean isShowHeader = false; //添加头 public BaseRecyclerAdapter(Context context, List<T> mList) { super(); this.context = context; this.mDatas = mList; } public void setPullLoadEnable(boolean enable) { mEnablePullLoad = enable; } public void setShowHeader(boolean enable) { isShowHeader = enable; } /** * TODO<添加数据,指定其位置> */ public void addData(T info, int position) { mDatas.add(position, info); notifyItemInserted(position); } /** * TODO<添加数据到最后面添加> */ public void addData(T info) { mDatas.add(info); notifyDataSetChanged(); } /** * TODO<删除数据,指定其位置> */ public void deleteData(int position) { mDatas.remove(position); notifyItemRemoved(position); } /** * TODO<某一位置开始,有itemCount个Item的数据删除> */ public void deleteDataAll(int positionStart, int itemCount) { for (int i = positionStart; i < itemCount; i++) { mDatas.remove(positionStart); } notifyItemRangeRemoved(positionStart, itemCount); } @Override public int getItemCount() { int size = mDatas.size(); if (mEnablePullLoad) { size++; } if (isShowHeader) { size++; } return size; } @Override public BaseViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { int mItemLayoutId = 0; switch (viewType) { case 0: mItemLayoutId = onCreateView(); break; case 1: mItemLayoutId = onCreateHeaderView(); break; case 2: mItemLayoutId = onCreateFootView(); break; } View view = View.inflate(viewGroup.getContext(), mItemLayoutId, null); // 创建一个ViewHolder BaseViewHolder holder = new BaseViewHolder(view, viewType); return holder; } /** * item的布局文件 */ public abstract int onCreateView(); /** * 第一条item的布局文件,如果setShowHeader为true的话,才会调用这里,下拉刷新或则有焦点图的使用 */ public int onCreateHeaderView() { return 0; } /** * 最后一条item的布局文件,如果setPullLoadEnable为true的话,才会调用这里,上垃加载更多等使用 */ public int onCreateFootView() { return 0; } @Override public void onBindViewHolder(BaseViewHolder viewHolder, int position) { if (isShowHeader) { position--; } if (viewHolder.getViewType() == 1) { convertHeader(viewHolder, position); } else if (viewHolder.getViewType() == 2) { if (mDatas == null || mDatas.size() == 0) { viewHolder.getConvertView().setVisibility(View.GONE); } else { viewHolder.getConvertView().setVisibility(View.VISIBLE); } convertFoot(viewHolder, position); } else if (viewHolder.getViewType() == 0) { if(onItemClickListener!=null){ final int finalPosition = position; viewHolder.getConvertView().setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onItemClickListener.onItemClick(finalPosition); } }); } convert(viewHolder, mDatas.get(position), position); } } /** * 把onBindViewHolder的内容放在这个方法写就可以了 */ public abstract void convert(BaseViewHolder helper, T item, int position); /** * 头部自定义处理的适配器,头部的onBindViewHolder写在这里 */ public void convertHeader(BaseViewHolder helper, int position) { } /** * 底部自定义处理的适配器,底部的onBindViewHolder写在这里 */ public void convertFoot(BaseViewHolder helper, int position) { } @Override public int getItemViewType(int position) { // 最后一个item设置为footerView if (position + 1 == getItemCount() && mEnablePullLoad) { return TYPE_FOOTER; } if (position == 0 && isShowHeader) { return TYPE_HEADER; } return TYPE_ITEM; } //RecyclerView没有Item点击标签,为RecyclerView打造点击事件 private OnItemClickListener onItemClickListener; public void setOnItemClickListener(OnItemClickListener onItemClickListener){ this.onItemClickListener = onItemClickListener; } public interface OnItemClickListener{ void onItemClick(int position); } }
2、重写RecyclerView.ViewHolder
package com.partjob.commonjar.base; import android.support.v7.widget.RecyclerView; import android.util.SparseArray; import android.view.View; import android.widget.TextView; public class BaseViewHolder extends RecyclerView.ViewHolder { private final SparseArray<View> mViews; private View mConvertView; private int viewType = 0; public BaseViewHolder(View itemView) { this(itemView, 0); } public BaseViewHolder(View itemView,int viewType) { super(itemView); this.viewType = viewType; this.mConvertView = itemView; this.mViews = new SparseArray<>(); } public View getConvertView() { return mConvertView; } /** * 通过控件的Id获取对于的控件,如果没有则加入views * * @param viewId * @return */ public <T extends View> T getView(int viewId) { View view = mViews.get(viewId); if (view == null) { view = mConvertView.findViewById(viewId); mViews.put(viewId, view); } return (T) view; } /** * 为TextView设置字符串 * * @param viewId * @param text * @return */ public RecyclerView.ViewHolder setText(int viewId, String text) { TextView view = getView(viewId); view.setText(text); return this; } public int getViewType() { return viewType; } public void setViewType(int viewType) { this.viewType = viewType; 3、只需要这两个类就可以了,下面我们看看使用,大家模仿着这样写就可以了,RecyclerView直接使用这个适配器继就可以了<pre name="code" class="java">/** * 新闻列表页的适配器 */ public class PhotoAdapter extends BaseRecyclerAdapter<PhotoDataContext> { private StyleUtils mStyleUtils = StyleUtils.getColorsUtils(); private XBitmapUtils mXBitmapUtils1, mXBitmapUtils2, mXBitmapUtils3, mXBitmapUtils4; public PhotoAdapter(BaseActivity activity, List<PhotoDataContext> data) { super(activity, data); mXBitmapUtils1 = new XBitmapUtils(activity, R.drawable.photo_bighor, R.drawable.photo_bighor); mXBitmapUtils2 = new XBitmapUtils(activity, R.drawable.photo_ver, R.drawable.photo_ver); mXBitmapUtils3 = new XBitmapUtils(activity, R.drawable.photo_pethor, R.drawable.photo_pethor); } @Override public int onCreateView() { return R.layout.adapter_photo; } @Override public void convert(BaseViewHolder helper, PhotoDataContext item, int position) { ImageView photoBigImg = helper.getView(R.id.photo_big_img); ImageView photoVerImg1 = helper.getView(R.id.photo_ver_img1); ImageView photoVerImg2 = helper.getView(R.id.photo_ver_img2); ImageView photoPetImg1 = helper.getView(R.id.photo_pet_img1); ImageView photoPetImg2 = helper.getView(R.id.photo_pet_img2); ImageView photoPetImg3 = helper.getView(R.id.photo_pet_img3); ImageView photoPetImg4 = helper.getView(R.id.photo_pet_img4); ImageView photoPetImg5 = helper.getView(R.id.photo_pet_img5); ImageView photoPetImg6 = helper.getView(R.id.photo_pet_img6); TextView photoTitle = helper.getView(R.id.photo_title); TextView photoNum = helper.getView(R.id.photo_num); TextView photoTime = helper.getView(R.id.photo_time); View photoLine = helper.getView(R.id.photo_line); photoTitle.setText(item.getTitle()); int num = item.getChildCount() - 1; photoNum.setText(String.valueOf(num)); photoTime.setText(DateUtils.getTime(item.getTime())); } @Override public int onCreateHeaderView() { return R.layout.viewpage_news_top; } @Override public int onCreateFootView() { return R.layout.view_footer_loading; } public void convertFoot(BaseViewHolder helper, int position) { TextView footerItemText = helper.getView(R.id.footer_item_text); //下拉框的字体颜色 footerItemText.setTextColor(mStyleUtils.getBlackWordColor()); } }
自己刚写博客,表达能力有限,请多多支持
相关文章推荐
- 算法:插入排序
- Project Euler:Problem 86 Cuboid route
- WSP_mainActivity
- 《Swift入门》关于Swift
- 58 单例模式与auto_ptr
- SDAU 1006
- ZOJ 1002 Fire Net
- Nginx的负载均衡 - 一致性哈希 (Consistent Hash)
- oracle物理dg状态检查
- hdu 3500 DFS(限定)
- 【Data Algorithms_Recipes for Scaling up with Hadoop and Spark】Chapter 12. K-Means Clustering
- RadioGroup标签及游标展示
- UVa 10340, All in All
- 第五周项目2-游戏中的角色类(1)
- SDAU 1004
- 20145229吴姗珊《Java程序设计》2天总结
- java学习第六天
- iOS框架学习
- 启用 mvc webapi 的 session功能可用
- 第五周学习进度情况