项目作者: NessCurie

项目描述 :
A ascension development efficiency for RecyclerView,you can see details in README.
高级语言: Java
项目地址: git://github.com/NessCurie/RecyclerViewUtils.git
创建时间: 2017-03-16T06:25:07Z
项目社区:https://github.com/NessCurie/RecyclerViewUtils

开源协议:

下载


RecyclerViewUtils

  1. 快速完成单类型item的Adapter;
  2. 便利完成多type类型item的Adapter;
  3. RecyclerView分割线的实现,支持GridLayoutManager的横竖都显示;
  4. 使用Google官方ItemTouchHelper完成侧拉删除和条目拖动和指定控件触发拖动;
  5. 封装item的长按和点击事件;
  6. 修改SwipeRefreshLayout同时支持下拉刷新和上拉加载更多,兼容条目拖动.

For more information please see RecyclerView总结与多功能便捷Adapter的封装

Download

Add this in your root build.gradle file (not your module build.gradle file):

  1. allprojects {
  2. repositories {
  3. maven { url 'https://jitpack.io' }
  4. }
  5. }

Then, add the library to your module build.gradle

  1. dependencies {
  2. compile 'com.github.NessCurie:RecyclerViewUtils:latest.release.here'
  3. }

such as release is v1.0

you can use:

  1. dependencies {
  2. compile 'com.github.NessCurie:RecyclerViewUtils:v1.0'
  3. }

Usage

单类型item:

创建SimpleAdapter对象,设置给RecyclerView即可:

  1. /**
  2. * 创建简单的recyclerView适配器
  3. *
  4. * @param context 上下文
  5. * @param id item的layout的id
  6. * @param list 集合
  7. */
  8. public SimpleAdapter(final Context context, final int id, List list)

比如:

  1. SimpleAdapter simpleAdapter = new SimpleAdapter(this, R.layout.item_simple, list) {
  2. @Override
  3. public void setItemData(final MViewHolder holder, String s, int position) {
  4. holder.setText(R.id.tv_center, s);
  5. }
  6. };

多类型item

1. 如果没有其他特殊需求可以直接new出BaseAdapter的对象.如果有其他需求可以继承重写部分方法.

  1. 可以重写其中的onViewHolderCreated()方法在创建完ViewHolder后做一些操作;
  2. 可以重写其中的isClickEnabled()设置哪些type不可点击.

2. 向adapter中添加IType的实现类

getLayoutId()返回对应itemType的布局的id
isThisTypeItem()提供判断是否是对应itemType的方法.
setData()对item中对应id的控件设置对应数据.可以使用MViewHolder中提供的一系列方法进行链式调用

比如:集合中存的为String类型,分别有数字和其他字符类型,将数字类型显示为一种item,其他字符显示为一种item.

  1. adapter = new BaseAdapter(this, list) {
  2. @Override
  3. public boolean isClickEnabled(int viewType) { //这里将数字type不可点击
  4. return viewType != 1;
  5. }
  6. };
  7. adapter.addType(new IType() {
  8. @Override
  9. public int getLayoutId() {
  10. return R.layout.item_type1;
  11. }
  12. @Override
  13. public boolean isThisTypeItem(String item, int position) {//不是数字的使用该type,是灰色背景
  14. try {
  15. Integer.parseInt(item);
  16. return false;
  17. } catch (NumberFormatException e) {
  18. return true;
  19. }
  20. }
  21. @Override
  22. public void setData(MViewHolder holder, String s, int position) {
  23. holder.setText(R.id.tv_center, s)
  24. .setDragListener(R.id.iv_hand);
  25. }
  26. });
  27. adapter.addType(new IType() {
  28. @Override
  29. public int getLayoutId() {
  30. return R.layout.item_type2;
  31. }
  32. @Override
  33. public boolean isThisTypeItem(String item, int position) { //是数字的使用该type,是红色背景
  34. try {
  35. Integer.parseInt(item);
  36. return true;
  37. } catch (NumberFormatException e) {
  38. return false;
  39. }
  40. }
  41. @Override
  42. public void setData(MViewHolder holder, String s, int position) {
  43. holder.setText(R.id.tv_center, s);
  44. }
  45. });

如果需要设置分割线,可以使用SimpleDecoration.

  1. /**
  2. * 使用系统默认分割线作为recyclerView的分割线
  3. */
  4. public SimpleDecoration(Context context)
  5. /**
  6. * 使用指定Drawable作为recyclerView的分割线
  7. */
  8. public SimpleDecoration(Context context, Drawable drawable)
  9. /**
  10. * 使用指定Drawable的id作为recyclerView的分割线
  11. */
  12. public SimpleDecoration(Context context, int drawID)

如果需要开启条目拖动和条目侧拉删除,调用adapter中的openItemTouch方法

  1. /**
  2. * 根据参数开启recycler的侧拉删除和长按拖动
  3. *
  4. * @param recyclerView adapter的RecyclerView的对象
  5. * @param openLongPressDrag 是否开启长按拖动
  6. * @param openSwipeDelete 是否开启侧滑删除
  7. * @param refreshLayout 因为在最顶部和最底部时拖动会和下拉刷新以及加载更多冲突,所以当有
  8. * 添加{@link SwipyRefreshLayout}的时候需要和下拉刷新的控件关联,
  9. * 如果没有添加下拉刷新和上拉的传null即可
  10. */
  11. public void openItemTouch(RecyclerView recyclerView, boolean openLongPressDrag,
  12. boolean openSwipeDelete, SwipyRefreshLayout refreshLayout)

比如:

  1. simpleAdapter.openItemTouch(recyclerview, true, true, swipyrefreshlayout);

如果要设置指定控件触发条目拖动

SimpleAdapter的setItemData()方法或IType实现类的setData()方法中,使用holder调用setDragListener(int id)即可,需要adapter调用上面的openItemTouch()方法,否则不会生效.

比如:holder.setDragListener(R.id.iv_hand);

如果需要设置item的点击和长按事件

点击和长按事件封装在BaseAdapter中,如果同时设置了长按拖动和长按点击事件,会同时触发.

  1. adapter.setOnItemLongClickListener(this);
  2. adapter.setOnItemClickListener(this);
  3. @Override
  4. public boolean onItemLongClick(View view, RecyclerView.ViewHolder holder, int position) {
  5. return false;
  6. }
  7. @Override
  8. public void onItemClick(View view, RecyclerView.ViewHolder holder, int position) {
  9. }

如果要添加下拉刷新或上拉加载更多

在布局文件中使用com.github.recyclerviewutils.SwipyRefreshLayout节点包裹RecyclerView,在xml中设置对应的refresh_mode或在代码中使用setRefreshMode(int)设置.

可以使用setColorSchemeResources()设置刷新控件中间的进度条的颜色,支持多个颜色,会依次出现

  1. swipyrefreshlayout.setColorSchemeResources(android.R.color.holo_blue_bright,
  2. android.R.color.holo_green_light, android.R.color.holo_orange_light,
  3. android.R.color.holo_red_light);

可以使用setProgressBackgroundColor()设置刷新控件的背景.

  1. swipyrefreshlayout.setProgressBackgroundColor(android.R.color.darker_gray);

设置刷新监听的回调,根据传来的参数判断是下拉刷新还是上拉加载更多

  1. swipyrefreshlayout.setOnRefreshListener(this);
  2. @Override
  3. public void onRefresh(int direction) {
  4. switch (direction) {
  5. case SwipyRefreshLayout.TOP:
  6. break;
  7. case SwipyRefreshLayout.BOTTOM:
  8. break;
  9. }
  10. }

刷新完毕后调用swipyrefreshlayout.setRefreshing(false);隐藏刷新控件