RecyclerView大家都使用过的话会有些不方便,现在对其封装一下,让其可以:
1.可以像ListView一样方便使用OnItemClickListener;
2.可省去ViewHolder,快速开发;
3.分割线问题,即提供万能分割线。

先看效果图:

贴上如何使用:

      LinearLayoutManager layoutManager = new LinearLayoutManager(this);layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);rvHorizontal.setLayoutManager(layoutManager);RecyclerViewDivider divder = new RecyclerViewDivider(false); // 创业分割,false为HORIZONTALdivder.setColor(0xff5ED0F2); // 分割线颜色divder.setMargin(this, 0, 15, 0, 15);  // 分割线边距divder.setDividerHeight(this, 1);// 分割线宽度rvHorizontal.addItemDecoration(divder);DataAdapter dataAdapter = new DataAdapter(this);rvHorizontal.setAdapter(dataAdapter);// layoutManager = new LinearLayoutManager(this);// layoutManager.setOrientation(LinearLayoutManager.VERTICAL);// rvVertical.setLayoutManager(layoutManager);// divder = new RecyclerViewDivider(true);// 创业分割,true为VERTICAL//  divder.setMargin(10, 10, 10, 10); // 分割线边距//  divder.setDividerHeight(50);// 分割线宽度 50要大于(10+10)//   // 分割线Drawable//  divder.setDrawable(ContextCompat.getDrawable(this, R.drawable.circle_bg));//  rvVertical.addItemDecoration(divder);//  DataAdapter dataAdapter1 = new DataAdapter(this);//  rvVertical.setAdapter(dataAdapter1);OnItemClickListener listener = new OnItemClickListener() {@Overridepublic void onItemClick(RecyclerHolder holder, int position) {Toast.makeText(MainActivity.this, String.valueOf(position), Toast.LENGTH_LONG).show();}};// 设置监听dataAdapter.setOnItemClickListener(listener);dataAdapter1.setOnItemClickListener(listener);

如何方便定义RecyclerAdatper:

public class DataAdapter extends RecyclerAdatper<Data> {public DataAdapter(Context context, List<Data> list) {super(context, list);}public DataAdapter(Context context) {super(context);for (int i = 0; i < 20; i++) {Data data = new Data();data.setName("Name:" + i);getList().add(data);}}@Overridepublic int getContentView(int viewType) {return R.layout.item_main_data;}@Overridepublic void onInitView(RecyclerHolder holder, Data object, int position) {holder.setText(R.id.tv_item_main_name, object.getName());}}

涉及到的circle_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><solid android:color="#56f53f"/><corners android:radius="6dp"/>
</shape>

demo地址:
TAO CODE: http://code.taobao.org/p/RecyclerViewDemo/src/
GitHub: https://github.com/scorpioyou/RecyclerViewDemo
主要由以下类:
OnItemClickListener
RecyclerAdatper
RecyclerHolder
RecyclerViewDivider

OnItemClickListener:

package com.recycler.lib;/*** creater:cyy* time:2017/2/8* describe:定义{@link android.support.v7.widget.RecyclerView}OnItemClickListener点击事件*/
public interface OnItemClickListener {/*** @param holder 操作的ViewHolder* @param position 点击item的位置*/void onItemClick(RecyclerHolder holder, int position);
}

RecyclerAdatper:

package com.recycler.lib;import android.content.Context;
import android.graphics.drawable.Drawable;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;import java.util.ArrayList;
import java.util.List;/*** creater:cyy* time:2017/2/8* describe:定义{@link android.support.v7.widget.RecyclerView}OnItemClickListener万能适配器*/
public abstract class RecyclerAdatper<T> extends RecyclerView.Adapter<RecyclerHolder> {private Context mContext;private List<T> mList;private OnItemClickListener mOnItemClickListener;public RecyclerAdatper(Context context) {this(context, new ArrayList<T>());}public RecyclerAdatper(Context context, List<T> list) {mContext = context;mList = list;}public Context getContext() {return mContext;}public void setOnItemClickListener(OnItemClickListener onItemClickListener) {this.mOnItemClickListener = onItemClickListener;}@Overridepublic RecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) {return new RecyclerHolder(getLayoutInflater().inflate(getContentView(viewType), parent,false));}@Overridepublic int getItemViewType(int position) {return super.getItemViewType(position);}@Overridepublic void onBindViewHolder(final RecyclerHolder holder, final int position) {onInitView(holder, getItem(position), position);if (null != mOnItemClickListener) { // 实现item点击事件回调holder.getView().setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mOnItemClickListener.onItemClick(holder, position);}});}}@Overridepublic int getItemCount() {if (null != mList) {return mList.size();}return 0;}//---------------------------------abstract--------------------------------/*** item布局ID** @param viewType 类别* @return item布局ID*/public abstract int getContentView(int viewType);/*** item刷新的回调** @param holder   ViewHolder* @param object   Item数据对象* @param position 刷新的位置*/public abstract void onInitView(RecyclerHolder holder, T object, int position);//---------------------------------List--------------------------------public List<T> getList() {return mList;}public void setList(List<T> list) {this.mList = list;notifyDataSetChanged();}public void clear() {this.mList.clear();notifyDataSetChanged();}public void remove(int location) {if (location >= 0 && mList.size() > location) {this.mList.remove(location);notifyDataSetChanged();}}public void add(int location, T object) {if (object != null) {this.mList.add(location, object);notifyDataSetChanged();}}public void addLast(T object) {if (object != null) {this.mList.add(object);notifyDataSetChanged();}}public void addHead(T object) {if (object != null) {this.mList.add(0, object);notifyDataSetChanged();}}public void addAll(List<T> list) {if (list != null) {this.mList.addAll(list);notifyDataSetChanged();}}public T getItem(int position) {return mList.get(position);}//---------------------------------other--------------------------------protected LayoutInflater getLayoutInflater() {return (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);}protected int getColor(int id) {return ContextCompat.getColor(getContext(), id);}protected String getString(int id) {return getContext().getResources().getString(id);}protected float getDimension(int id) {return getContext().getResources().getDimension(id);}protected Drawable getDrawable(int id) {return ContextCompat.getDrawable(getContext(), id);}}

RecyclerHolder:

package com.recycler.lib;import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.text.util.Linkify;
import android.util.SparseArray;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.Checkable;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RatingBar;
import android.widget.TextView;/*** creater:cyy* time:2017/2/8* describe:*/
public class RecyclerHolder extends RecyclerView.ViewHolder {private View convertView;public RecyclerHolder(View itemView) {super(itemView);convertView = itemView;}public <T extends View> T getView(int viewId) {return retrieveView(viewId);}protected <T extends View> T retrieveView(int viewId) {SparseArray<View> viewHolder = (SparseArray<View>) convertView.getTag();if (null == viewHolder) {viewHolder = new SparseArray<View>();convertView.setTag(viewHolder);}View childView = viewHolder.get(viewId);if (null == childView) {childView = convertView.findViewById(viewId);viewHolder.put(viewId, childView);}return (T) childView;}public RecyclerHolder setText(int viewId, CharSequence value) {TextView view = retrieveView(viewId);if (TextUtils.isEmpty(value)) {view.setText("");} else {view.setText(value);}return this;}public RecyclerHolder setImageResource(int viewId, int imageResId) {ImageView view = retrieveView(viewId);view.setImageResource(imageResId);return this;}public RecyclerHolder setBackgroundColor(int viewId, int color) {View view = retrieveView(viewId);view.setBackgroundColor(color);return this;}public RecyclerHolder setBackgroundRes(int viewId, int backgroundRes) {View view = retrieveView(viewId);view.setBackgroundResource(backgroundRes);return this;}public RecyclerHolder setTextColor(int viewId, int textColor) {TextView view = retrieveView(viewId);view.setTextColor(textColor);return this;}public RecyclerHolder setTextColorRes(int viewId, int textColorRes) {TextView view = retrieveView(viewId);view.setTextColor(ContextCompat.getColor(view.getContext(), textColorRes));return this;}public RecyclerHolder setImageDrawable(int viewId, Drawable drawable) {ImageView view = retrieveView(viewId);view.setImageDrawable(drawable);return this;}public RecyclerHolder setImageBitmap(int viewId, Bitmap bitmap) {ImageView view = retrieveView(viewId);view.setImageBitmap(bitmap);return this;}@SuppressLint("NewApi")public RecyclerHolder setAlpha(int viewId, float value) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {retrieveView(viewId).setAlpha(value);} else {// Pre-honeycomb hack to set Alpha valueAlphaAnimation alpha = new AlphaAnimation(value, value);alpha.setDuration(0);alpha.setFillAfter(true);retrieveView(viewId).startAnimation(alpha);}return this;}public RecyclerHolder setVisible(int viewId, boolean visible) {View view = retrieveView(viewId);view.setVisibility(visible ? View.VISIBLE : View.GONE);return this;}public RecyclerHolder setVisible(int viewId, int visibility) {View view = retrieveView(viewId);view.setVisibility(visibility);return this;}/*** Add links into a TextView.** @param viewId The id of the TextView to linkify.* @return The BaseAdapterHelper for chaining.*/public RecyclerHolder linkify(int viewId) {TextView view = retrieveView(viewId);Linkify.addLinks(view, Linkify.ALL);return this;}/*** Apply the typeface to the given viewId, and enable subpixel rendering.*/public RecyclerHolder setTypeface(int viewId, Typeface typeface) {TextView view = retrieveView(viewId);view.setTypeface(typeface);view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG);return this;}/*** Apply the typeface to all the given viewIds, and enable subpixel* rendering.*/public RecyclerHolder setTypeface(Typeface typeface, int... viewIds) {for (int viewId : viewIds) {TextView view = retrieveView(viewId);view.setTypeface(typeface);view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG);}return this;}/*** Sets the progress of a ProgressBar.** @param viewId   The view id.* @param progress The progress.* @return The BaseAdapterHelper for chaining.*/public RecyclerHolder setProgress(int viewId, int progress) {ProgressBar view = retrieveView(viewId);view.setProgress(progress);return this;}/*** Sets the progress and max of a ProgressBar.** @param viewId   The view id.* @param progress The progress.* @param max      The max value of a ProgressBar.* @return The BaseAdapterHelper for chaining.*/public RecyclerHolder setProgress(int viewId, int progress, int max) {ProgressBar view = retrieveView(viewId);view.setMax(max);view.setProgress(progress);return this;}/*** Sets the range of a ProgressBar to 0...max.** @param viewId The view id.* @param max    The max value of a ProgressBar.* @return The BaseAdapterHelper for chaining.*/public RecyclerHolder setMax(int viewId, int max) {ProgressBar view = retrieveView(viewId);view.setMax(max);return this;}/*** Sets the rating (the number of stars filled) of a RatingBar.** @param viewId The view id.* @param rating The rating.* @return The BaseAdapterHelper for chaining.*/public RecyclerHolder setRating(int viewId, float rating) {RatingBar view = retrieveView(viewId);view.setRating(rating);return this;}/*** Sets the rating (the number of stars filled) and max of a RatingBar.** @param viewId The view id.* @param rating The rating.* @param max    The range of the RatingBar to 0...max.* @return The BaseAdapterHelper for chaining.*/public RecyclerHolder setRating(int viewId, float rating, int max) {RatingBar view = retrieveView(viewId);view.setMax(max);view.setRating(rating);return this;}/*** Sets the tag of the view.** @param viewId The view id.* @param tag    The tag;* @return The BaseAdapterHelper for chaining.*/public RecyclerHolder setTag(int viewId, Object tag) {View view = retrieveView(viewId);view.setTag(tag);return this;}/*** Sets the tag of the view.** @param viewId The view id.* @param key    The key of tag;* @param tag    The tag;* @return The BaseAdapterHelper for chaining.*/public RecyclerHolder setTag(int viewId, int key, Object tag) {View view = retrieveView(viewId);view.setTag(key, tag);return this;}/*** Sets the checked status of a checkable.** @param viewId  The view id.* @param checked The checked status;* @return The BaseAdapterHelper for chaining.*/public RecyclerHolder setChecked(int viewId, boolean checked) {Checkable view = (Checkable) retrieveView(viewId);view.setChecked(checked);return this;}/*** Sets the adapter of a adapter view.** @param viewId  The view id.* @param adapter The adapter;* @return The BaseAdapterHelper for chaining.*/public RecyclerHolder setAdapter(int viewId, Adapter adapter) {AdapterView view = retrieveView(viewId);view.setAdapter(adapter);return this;}/*** Sets the on click listener of the view.** @param viewId   The view id.* @param listener The on click listener;* @return The BaseAdapterHelper for chaining.*/public RecyclerHolder setOnClickListener(int viewId, View.OnClickListener listener) {View view = retrieveView(viewId);view.setOnClickListener(listener);return this;}public RecyclerHolder setOnCheckedChangeListener(int viewId, CompoundButton.OnCheckedChangeListener listener) {CompoundButton view = retrieveView(viewId);view.setOnCheckedChangeListener(listener);return this;}/*** Sets the on touch listener of the view.** @param viewId   The view id.* @param listener The on touch listener;* @return The BaseAdapterHelper for chaining.*/public RecyclerHolder setOnTouchListener(int viewId, View.OnTouchListener listener) {View view = retrieveView(viewId);view.setOnTouchListener(listener);return this;}/*** Sets the on long click listener of the view.** @param viewId   The view id.* @param listener The on long click listener;* @return The BaseAdapterHelper for chaining.*/public RecyclerHolder setOnLongClickListener(int viewId, View.OnLongClickListener listener) {View view = retrieveView(viewId);view.setOnLongClickListener(listener);return this;}/*** Retrieve the convertView*/public View getView() {return convertView;}}

RecyclerViewDivider:

package com.recycler.lib;import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.annotation.ColorRes;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.ViewCompat;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.LinearLayout;/*** creater:cyy* time:2017/2/8* describe:*/
public class RecyclerViewDivider extends RecyclerView.ItemDecoration {private Drawable mDivider;private int mDividerHeight = 0;private Paint mPaint;private int mOrientation;private final Rect mBounds = new Rect();private Rect mMarginBounds;public RecyclerViewDivider() {mOrientation = LinearLayout.VERTICAL;}public RecyclerViewDivider(boolean isVertical) {if (isVertical) {mOrientation = LinearLayout.VERTICAL;} else {mOrientation = LinearLayout.HORIZONTAL;}}public void setDividerHeight(int px) {this.mDividerHeight = px;}public void setDividerHeight(Context c, int dp) {this.mDividerHeight = (int) (dp * c.getResources().getDisplayMetrics().density);}public void setDrawable(@NonNull Drawable drawable) {mDivider = drawable;}public void setColor(int color) {mPaint = new Paint();mPaint.setColor(color);}public void setColor(Context c, @ColorRes int colorId) {setColor(ContextCompat.getColor(c, colorId));}public void setMargin(int left, int top, int right, int bottom) {mMarginBounds = new Rect();mMarginBounds.left = left;mMarginBounds.top = top;mMarginBounds.right = right;mMarginBounds.bottom = bottom;}public void setMargin(Context c, int leftDp, int topDp, int rightDp, int bottomDp) {float density = c.getResources().getDisplayMetrics().density;mMarginBounds = new Rect();mMarginBounds.left = (int) (leftDp * density);mMarginBounds.top = (int) (topDp * density);mMarginBounds.right = (int) (rightDp * density);mMarginBounds.bottom = (int) (bottomDp * density);}@Overridepublic void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {if (parent.getLayoutManager() == null) {return;}if (mOrientation == LinearLayout.VERTICAL) {drawVertical(c, parent);} else {drawHorizontal(c, parent);}}@SuppressLint("NewApi")private void drawVertical(Canvas canvas, RecyclerView parent) {canvas.save();final int left;final int right;if (parent.getClipToPadding()) {left = parent.getPaddingLeft();right = parent.getWidth() - parent.getPaddingRight();canvas.clipRect(left, parent.getPaddingTop(), right,parent.getHeight() - parent.getPaddingBottom());} else {left = 0;right = parent.getWidth();}final int childCount = parent.getChildCount();for (int i = 0; i < childCount; i++) {final View child = parent.getChildAt(i);parent.getDecoratedBoundsWithMargins(child, mBounds);final int bottom = mBounds.bottom + Math.round(ViewCompat.getTranslationY(child));int top = bottom - mDividerHeight;if (null != mDivider) {int sicWidth = mDivider.getIntrinsicWidth();if (sicWidth > 0) {top = bottom - sicWidth;}if (null != mMarginBounds) {mDivider.setBounds(left + mMarginBounds.left, top + mMarginBounds.top,right - mMarginBounds.right, bottom - mMarginBounds.bottom);} else {mDivider.setBounds(left, top, right, bottom);}mDivider.draw(canvas);}if (mPaint != null) {if (null != mMarginBounds) {canvas.drawRect(left + mMarginBounds.left, top + mMarginBounds.top,right - mMarginBounds.right, bottom - mMarginBounds.bottom, mPaint);} else {canvas.drawRect(left, top, right, bottom, mPaint);}}}canvas.restore();}@SuppressLint("NewApi")private void drawHorizontal(Canvas canvas, RecyclerView parent) {canvas.save();final int top;final int bottom;if (parent.getClipToPadding()) {top = parent.getPaddingTop();bottom = parent.getHeight() - parent.getPaddingBottom();canvas.clipRect(parent.getPaddingLeft(), top,parent.getWidth() - parent.getPaddingRight(), bottom);} else {top = 0;bottom = parent.getHeight();}final int childCount = parent.getChildCount();for (int i = 0; i < childCount; i++) {final View child = parent.getChildAt(i);parent.getLayoutManager().getDecoratedBoundsWithMargins(child, mBounds);int right = mBounds.right + Math.round(ViewCompat.getTranslationX(child));int left = right - mDividerHeight;if (null != mDivider) {int sicWidth = mDivider.getIntrinsicWidth();if (sicWidth > 0) {left = right - sicWidth;}if (null != mMarginBounds) {mDivider.setBounds(left + mMarginBounds.left, top + mMarginBounds.top,right - mMarginBounds.right, bottom - mMarginBounds.bottom);} else {mDivider.setBounds(left, top, right, bottom);}mDivider.draw(canvas);}if (mPaint != null) {if (null != mMarginBounds) {canvas.drawRect(left + mMarginBounds.left, top + mMarginBounds.top,right - mMarginBounds.right, bottom - mMarginBounds.bottom, mPaint);} else {canvas.drawRect(left, top, right, bottom, mPaint);}}}canvas.restore();}@Overridepublic void getItemOffsets(Rect outRect, View view, RecyclerView parent,RecyclerView.State state) {if (mOrientation == LinearLayout.VERTICAL) {if (0 == mDividerHeight && null != mDivider) {outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());} else {outRect.set(0, 0, 0, mDividerHeight);}} else {if (0 == mDividerHeight && null != mDivider) {outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);} else {outRect.set(0, 0, mDividerHeight, 0);}}}
}

Android 封装RecyclerView.Adapter,省其ViewHolder相关推荐

  1. android电脑文件列表不刷新,Android 利用RecyclerView.Adapter刷新列表中的单个view问题...

    首先使用RecyclerView的adapter继承:RecyclerView.Adapter public class OrderListAdapter extends RecyclerView.A ...

  2. android之RecyclerView.Adapter介绍

    image.png

  3. RecyclerView.Adapter的封装(RecyclerAdapter)

    思路 ListView中已经自带了添加头布局和添加底部布局的方法,但是在RecyclerView中,却没有默认实现,这导致在实现一些特殊布局中不是那么的方便. 在实现RecyclerView.Adap ...

  4. 超级封装RecyclerView的适配器Adapter 只需二三十行代码

    前言 android开发中,RecyclerView是很常用的控件,而且功能也很强大,并且各种三方封装或者扩展库也是非常多,如:BaseQuickAdapter,XRecyclerview,当然还有我 ...

  5. RecyclerView Adapter 优雅封装搞定所有列表

    转载自: 依然范特稀西 RecycleView加载列表,封装Adapter,快速高效的添加一个列表(包括单 Item 列表和多item列表). 理念 1, 构造一个通用的Adapter模版,避免每添加 ...

  6. android activity调用Adapter方法刷新列表UI,RecyclerView.Adapter

    在adapter中创建被调用方法cleckAll public class JYfkleixinAdapter extends RecyclerView.Adapter<JYfkleixinAd ...

  7. RecyclerView.Adapter:全能notify解决方案

    原文链接: https://loshine.me/2016/08/25/a-universal-solution-of-recyclerview-adapter-notify/ 在之前我们用 List ...

  8. Android 给RecyclerView添加头部和尾部

    之前我在GitHub上开源了一个可以实现RecyclerView列表分组的通用Adapter: GroupedRecyclerViewAdapter.也在博客上写了一篇专门介绍它的实现和使用的文章:& ...

  9. kotlin中RecyclerView.Adapter通用适配器

    文章目录 结合databinding,livedata BaseViewHolder BaseAdapter recycleView通用adapter 使用 数据bean ViewModel 绑定it ...

最新文章

  1. html的body内标签之图片及表格
  2. 什么是线程安全,你真的了解吗?
  3. mysql 优化设计库_MySQL 数据库最优化设计原则
  4. java事件编程_java基础 ---Swing事件编程
  5. 第3章 变量和表达式
  6. iOS 9.0 设置状态栏颜色 和隐藏
  7. java创建线程的两种方法是_java创建线程的两种方法
  8. redis zset底层数据结构
  9. android下拉刷新listView剖析
  10. 2021必看!java电子书合集
  11. Win10安装Eclipse教程
  12. c++ 中 setw()函数
  13. 嵌入式Linux系统工程师系列之ARM920T的MMU与Cache
  14. 北京师范大学网络教育计算机考试题,2020年北京师范大学网络教育入学考试高起专语文模拟题及答案(机考古文阅读)...
  15. smartbi v7 Linux,配置Smartbi
  16. 解决Arial字体“高低肩问题”
  17. Excel做数据海报
  18. 【VB界面】子类化重绘仿QQ2009渐变按钮(模块)
  19. 如何在Joomla中创建一个漂亮的单页网站
  20. android 图库刷新,关于主动刷新Android系统图库方法总结

热门文章

  1. Huawei Matebook X Pro 2018把Kali安装到物理机以及使用之中遇到的问题汇总
  2. 看懂联想服务器系列产品分类(上)
  3. jzoj4762. 千帆渡
  4. 硅谷又出来“唬人”了?改变情绪的可穿戴设备是它最新的骗局
  5. 初次约会,如何避免尴尬?这6个话题可以帮你
  6. 服务器阵列管理工具之perccli和storccli
  7. 【自然语言处理】中文文本预处理及词云_以小说《白夜行》为例
  8. 生命游戏c++版代码
  9. 《英灵神殿》是如何让不玩生存游戏的我沉迷100小时的
  10. OpenCV(图片自由缩放及边缘裁剪)