欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

RecyclerView實(shí)現(xiàn)流式標(biāo)簽單選多選功能

 更新時(shí)間:2019年11月21日 10:09:45   作者:ImomoTo  
RecyclerView是Android一個(gè)更強(qiáng)大的控件,其不僅可以實(shí)現(xiàn)和ListView同樣的效果,還有優(yōu)化了ListView中的各種不足。這篇文章主要介紹了RecyclerView實(shí)現(xiàn)的流式標(biāo)簽單選多選功能,需要的朋友可以參考下

RecyclerView簡介

RecyclerView是Android一個(gè)更強(qiáng)大的控件,其不僅可以實(shí)現(xiàn)和ListView同樣的效果,還有優(yōu)化了ListView中的各種不足。其可以實(shí)現(xiàn)數(shù)據(jù)縱向滾動(dòng),也可以實(shí)現(xiàn)橫向滾動(dòng)(ListView做不到橫向滾動(dòng))。接下來講解RecyclerView的用法。

RecyclerView 基本用法

因?yàn)镽ecyclerView屬于新增的控件,Android將RecyclerView定義在support庫里。若要使用RecyclerView,第一步是要在build.gradle中添加對(duì)應(yīng)的依賴庫。

一、實(shí)現(xiàn)效果

單選效果:

在這里插入圖片描述

多選效果:

在這里插入圖片描述

二、前期準(zhǔn)備

依賴的添加:

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

三、使用方法

3.1、多選的實(shí)現(xiàn)

1、使用集合存儲(chǔ)需要存儲(chǔ)或者展示的數(shù)據(jù)

public static Set<Integer> positionSet = new HashSet<>(); //用于存儲(chǔ)選擇的位置
  private boolean selectMode = true; //選擇模式 多選或者單選 true 多選
  public Set<String> checkTYpeNameSet = new HashSet<>(); //用于存儲(chǔ)選擇項(xiàng)的名稱

2、實(shí)現(xiàn)流式布局的布局管理器

 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、單條點(diǎn)擊事件的處理

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="醫(yī)藥"
    android:id="@+id/alive_type_tv"
    android:textColor="#60000000"
    android:paddingBottom="10dp"
    android:paddingTop="10dp" />
</com.lhx.flowtagdemo.recycler.CheckableLayout>

6、CheckableLayout的使用說明:

實(shí)現(xiàn)了Checkable接口,可用于布局的選擇,設(shè)置選擇的樣式

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、單選的實(shí)現(xiàn)

單選和多選的代碼幾乎完全一致, 只需要修改一部分

1、去除記錄選擇名稱的集合, 將選擇模式設(shè)置為false

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

2 、單條點(diǎn)擊事件需要進(jìn)行修改

mAdapter.setOnItemClickListener(new OnItemClickListener() {
      @Override
      public void OnItemClick(View view, int position) {
        if (selectMode) {
          // 如果當(dāng)前處于多選狀態(tài),則進(jìn)入多選狀態(tài)的邏輯
          // 維護(hù)當(dāng)前已選的position
          addOrRemove(position);
        } else {
          // 如果不是多選狀態(tài),則進(jìn)入單選事件的業(yè)務(wù)邏輯
          if (!positionSet.contains(position)) {
            // 選擇不同的單位時(shí)取消之前選中的單位
            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中數(shù)據(jù)綁定的集合需要更換

在這里插入圖片描述

其他的都是一樣的了:

附上DEMO下載地址:

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

總結(jié)

以上所述是小編給大家介紹的RecyclerView實(shí)現(xiàn)流式標(biāo)簽單選多選功能,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

相關(guān)文章

最新評(píng)論