RecyclerView简介

RecyclerView是Android一个更强大的控件,其不仅可以实现和ListView同样的效果,还有优化了ListView中的各种不足。其可以实现数据纵向滚动,也可以实现横向滚动(ListView做不到横向滚动)。接下来讲解RecyclerView的用法。

RecyclerView 基本用法

因为RecyclerView属于新增的控件,Android将RecyclerView定义在support库里。若要使用RecyclerView,第一步是要在build.gradle中添加对应的依赖库。

一、实现效果

单选效果:

在这里插入图片描述

多选效果:

在这里插入图片描述

二、前期准备

依赖的添加:

  //瀑布流LayoutManager
  implementation 'com.google.android:flexbox:1.0.0' 
  //RecyclerView
  implementation 'com.android.support:design:28.0.0'

三、使用方法

3.1、多选的实现

1、使用集合存储需要存储或者展示的数据

public static Set<Integer> positionSet = new HashSet<>(); //用于存储选择的位置
  private boolean selectMode = true; //选择模式 多选或者单选 true 多选
  public Set<String> checkTYpeNameSet = new HashSet<>(); //用于存储选择项的名称

2、实现流式布局的布局管理器

 mRecyclerView = (RecyclerView) findViewById(R.id.recycler);
    FlexboxLayoutManager manager = new FlexboxLayoutManager(this, FlexDirection.ROW, FlexWrap.WRAP){
      @Override
      public boolean canScrollVertically() {
        return false;
      }
    };
    mRecyclerView.setLayoutManager(manager);

3、单条点击事件的处理

mAdapter.setOnItemClickListener(new OnItemClickListener() {
      @Override
      public void OnItemClick(View view, int position) {
        addOrRemove(position);
      }
      @Override
      public void OnItemLongClick(View view, int position) {
      }
    });
 private void addOrRemove(int position) {
    if (positionSet.contains(position)) {
      // 如果包含,则撤销选择
      positionSet.remove(position);
      checkTYpeNameSet.remove(mListData.get(position).getTagName());
    } else {
      // 如果不包含,则添加
      positionSet.add(position);
      checkTYpeNameSet.add(mListData.get(position).getTagName());
    }
    if (positionSet.size() == 0) {
      // 如果没有选中任何的item,则退出多选模式
      mAdapter.notifyDataSetChanged();
      selectMode = false;
    } else {
      // 更新列表界面,否则无法显示已选的item
      mAdapter.notifyDataSetChanged();
    }
    Log.e("info",positionSet.toString());
    Toast.makeText(MultipleChoiceActivity.this,checkTYpeNameSet.toString(),Toast.LENGTH_SHORT).show();
  }

4、适配的写法

public class MultipleRecyclerAdapter extends RecyclerView.Adapter<MultipleRecyclerAdapter.ViewHolder> {
  private Context mContext;
  private List<TestBean> mListData = new ArrayList<>();
  private OnItemClickListener mOnItemClickListener;
  public void setOnItemClickListener(OnItemClickListener mOnItemClickListener) {
    this.mOnItemClickListener = mOnItemClickListener;
  }
  public MultipleRecyclerAdapter(Context mContext, List<TestBean> mListData) {
   // mListData = new ArrayList<>();
    this.mContext = mContext;
    this.mListData = mListData;
  }
  public void update(List<TestBean> list){
    if(list != null && list.size() > 0){
      mListData.addAll(list);
      notifyDataSetChanged();
    }
  }
  class ViewHolder extends RecyclerView.ViewHolder{
    TextView typeTv;
    CheckableLayout rootLayout;
    public ViewHolder(@NonNull View itemView) {
      super(itemView);
      typeTv = (TextView) itemView.findViewById(R.id.alive_type_tv);
      rootLayout = (CheckableLayout) itemView.findViewById(R.id.root_layout);
    }
  }
  @NonNull
  @Override
  public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    if(mContext == null){
      mContext = viewGroup.getContext();
    }
    View view = LayoutInflater.from(mContext).inflate(R.layout.item_recycler,viewGroup,false);
    return new ViewHolder(view);
  }
  @Override
  public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
    Set<Integer> positionSet = MultipleChoiceActivity.positionSet;
    //检查set里是否包含position,包含则显示选中的背景色,不包含则反之
    if (positionSet.contains(position)) {
      holder.rootLayout.setChecked(true);
      holder.typeTv.setTextColor(mContext.getResources().getColor(R.color.white));
    } else {
      holder.rootLayout.setChecked(false);
      holder.typeTv.setTextColor(mContext.getResources().getColor(R.color.grey_60));
    }
    TestBean bean = mListData.get(position);
    holder.typeTv.setText(bean.getTagName());
    if(mOnItemClickListener != null) {
      holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
          int pos = holder.getLayoutPosition();
          mOnItemClickListener.OnItemClick(holder.itemView, pos);
          holder.rootLayout.setChecked(true);
        }
      });
    }
  }
  @Override
  public int getItemCount() {
    return mListData != null ? mListData.size() : 0;
  }
}

5、单条布局的XML文件

<?xml version="1.0" encoding="utf-8"?>
<com.lhx.flowtagdemo.recycler.CheckableLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_marginLeft="8dp"
  android:layout_marginTop="6dp"
  android:id="@ id/root_layout"
  android:background="@drawable/type_select_bg_color"
  xmlns:tools="http://schemas.android.com/tools">
  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingRight="18dp"
    android:paddingLeft="18dp"
    android:gravity="center"
    android:textSize="14sp"
    tools:text="医药"
    android:id="@ id/alive_type_tv"
    android:textColor="#60000000"
    android:paddingBottom="10dp"
    android:paddingTop="10dp" />
</com.lhx.flowtagdemo.recycler.CheckableLayout>

6、CheckableLayout的使用说明:

实现了Checkable接口,可用于布局的选择,设置选择的样式

public class CheckableLayout extends RelativeLayout implements Checkable {
  private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked};
  private boolean mChecked;
  public CheckableLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
  }
  @Override
  public void setChecked(boolean b) {
    if (b != mChecked){
      mChecked = b;
      refreshDrawableState();
    }
  }
  @Override
  public boolean isChecked() {
    return mChecked;
  }
  @Override
  public void toggle() {
    setChecked(!mChecked);
  }
  @Override
  protected int[] onCreateDrawableState(int extraSpace) {
    final int[] drawableState = super.onCreateDrawableState(extraSpace   1);
    if (isChecked()) mergeDrawableStates(drawableState, CHECKED_STATE_SET);
    return drawableState;
  }
}

3.2、单选的实现

单选和多选的代码几乎完全一致, 只需要修改一部分

1、去除记录选择名称的集合, 将选择模式设置为false

public static Set<Integer> positionSet = new HashSet<>();
  private boolean selectMode = false; //选择模式 多选或者单选 true 多选

2 、单条点击事件需要进行修改

mAdapter.setOnItemClickListener(new OnItemClickListener() {
      @Override
      public void OnItemClick(View view, int position) {
        if (selectMode) {
          // 如果当前处于多选状态,则进入多选状态的逻辑
          // 维护当前已选的position
          addOrRemove(position);
        } else {
          // 如果不是多选状态,则进入单选事件的业务逻辑
          if (!positionSet.contains(position)) {
            // 选择不同的单位时取消之前选中的单位
            positionSet.clear();
          }
          addOrRemove(position);
        }
        String kindName = mListData.get(position).getTagName();
        Toast.makeText(SingleChoiceActivity.this, kindName, Toast.LENGTH_SHORT).show();
      }
      @Override
      public void OnItemLongClick(View view, int position) {
      }
    });
 private void addOrRemove(int position) {
    if (positionSet.contains(position)) {
      // 如果包含,则撤销选择
      positionSet.remove(position);
    } else {
      // 如果不包含,则添加
      positionSet.add(position);
    }
    if (positionSet.size() == 0) {
      // 如果没有选中任何的item,则退出多选模式
      mAdapter.notifyDataSetChanged();
      selectMode = false;
    } else {
      // 更新列表界面,否则无法显示已选的item
      mAdapter.notifyDataSetChanged();
    }
  }

3、Adapter中数据绑定的集合需要更换

在这里插入图片描述

其他的都是一样的了:

附上DEMO下载地址:

GITHUB:https://github.com/muyexiaogui/FlowTagDemo

总结

以上所述是小编给大家介绍的RecyclerView实现流式标签单选多选功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对Devmax网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

RecyclerView实现流式标签单选多选功能的更多相关文章

  1. android – AnimateLayoutChanges不适用于RecyclerView

    XMLJAVA解决方法过了一会儿我得到了解决方案.我创建了一个函数来设置recyclelerView高度的动画.JAVA}

  2. android – 在RecyclerView中更新ProgressBar

    我有一个RecyclerView.其中,项目具有标准布局–一个TextView和一个ProgressBar.项目在运行时添加到recyclerview.每当添加一个Item时,都会启动一个更新ProgressBar的AsyncTask.AsynTask保存了RecyclerViewAdapter对ProgressBar对象的引用.当回收器视图中的项目太多时,会发生此问题.我知道RecyclerVi

  3. android – WearableRecyclerView .scrollToPosition不适合穿?

    我有一组应该在列表中填充的项目,因为我使用了WearableRecyclerView.在某些情况下,我希望特定的项目成为焦点以供选择.我正在使用Wearablelinearlayoutmanager的scrollToPosition()方法,但监视列表不会滚动到所需的位置,但是在使用RecyclerView和scrollLooutManager的scrollToPosition()的手机上也是如此

  4. android – 在RecyclerView中更改单个drawable的颜色将更改所有drawable

    我只是试图根据一个值改变我的行内部drawable的颜色,但是不是一个drawable,适配器改变了所有这些颜色.这是我的适配器:知道怎么做?谢谢您的帮助!!!

  5. android – 我可以像这样创建一个nestedScroll布局吗?

    我认为它可以通过nestedScrollingChildnestedScrollingParent来实现.但我无法理解他们.谁可以帮助我!产品经理坚持设计.ScrollView包含LinearLayout,“TabLayout”和ViewPager.ViewPager包含2个包含RecyclerView的片段或仅包含2个RecyclerView.当ScrollView滚动到Bottom时,Recy

  6. android – 在NestedScrollView onBindViewHolder中的RecyclerView调用所有getItemCount大小

    当我将RecyclerView放入nestedScrollView时,然后onBindViewHolder调用所有行,比如说我有一个大小为30的列表,那么即使没有滚动,也会同时为所有30行调用onBindViewHolder我的xml是但如果我删除nestedScrollView它正常工作.解决方法高度问题引起的问题.1)编辑nestedScrollView&RecyclerView如下:2)确保

  7. android – RecyclerView滚动条在第一个项目后跳回到顶部

    我创建了一个非常基本的RecyclerView示例.布局:活动:现在,当我滚动到第一个项目之外时,滚动条会跳回到顶部然后继续正常.第二个问题是当我滚动到底部时,滚动条会提前停止.这是支持库中的错误还是我自己的错?解决方法如here所述,此错误已在新版本的支持库v21.0.2中得到修复.

  8. android – 将项目添加到recyclerview的顶部

    我的活动中有一个Recyclerview.当我下拉它将加载新项目回收视图.现在我需要实现pull来将概念刷新到我的recyclerview.我做到了.但是当我调用pull来刷新时,我正在获取新项目并添加到回收视图底部.我需要在循环视图的顶部添加新项目.如何将新加载的项目添加到回收站视图的顶部位置.解决方法我会坚持要在第0个位置添加项目,这个位置来自拉动刷新,如下所示,

  9. android – 如何在另一个recycleview适配器下的recycleview适配器?

    我有一个RecyclerView.它有一个自定义布局,在自定义布局内是另一个RecyclerView.当我通知回收站视图项目已被删除时,我的主回收站视图已更新,但我的自定义视图回收视图未收到通知.这是要删除的RecyclerView滑动的代码.在我的购物车适配器中我采取了另一个回收视图适应.任何想法如何通知自适应如果从循环视图中删除任何数据.???我的onBindViewHolder类家长回收视图儿童recycleview解决方法首先,为什么你甚至需要另一个回收者视图?

  10. android – Animate Recycler在列数更改时查看网格

    我正在使用带有GridLayoutManager的RecyclerView.用户可以在2到4之间切换跨度计数,这将导致动画将每个单元格的内置翻译动画运行到其新位置.我到目前为止使用的代码是:这对我来说一直很好,但现在我需要为每个跨度计数设置不同的布局.为了支持这一点,我在RecyclerView中有2种视图类型,并且由于在移动到新的跨度计数时视图类型已更改,因此RecyclerView无法看到它是

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部