RecyclerView如何实现流式标签单选多选功能
创始人
2024-12-20 04:41:44
0次

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 positionSet = new HashSet<>(); //用于存储选择的位置  private boolean selectMode = true; //选择模式 多选或者单选 true 多选  public Set 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 {  private Context mContext;  private List mListData = new ArrayList<>();  private OnItemClickListener mOnItemClickListener;  public void setOnItemClickListener(OnItemClickListener mOnItemClickListener) {    this.mOnItemClickListener = mOnItemClickListener;  }  public MultipleRecyclerAdapter(Context mContext, List mListData) {   // mListData = new ArrayList<>();    this.mContext = mContext;    this.mListData = mListData;  }  public void update(List 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 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文件

 

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 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();    }  }

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...