RecyclerView實(shí)現(xiàn)流式標(biāo)簽單選多選功能
RecyclerView簡(jiǎn)介
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)注明出處,謝謝!
上一篇:Android Selector 按下修改背景和文本顏色的實(shí)現(xiàn)代碼
欄 目:Android
下一篇:Android中AlertDialog四種對(duì)話框的最科學(xué)編寫用法(實(shí)例代碼)
本文標(biāo)題:RecyclerView實(shí)現(xiàn)流式標(biāo)簽單選多選功能
本文地址:http://mengdiqiu.com.cn/a1/Android/9055.html
您可能感興趣的文章
- 01-10Android實(shí)現(xiàn)雙擊返回鍵退出應(yīng)用實(shí)現(xiàn)方法詳解
- 01-10android實(shí)現(xiàn)記住用戶名和密碼以及自動(dòng)登錄
- 01-10android實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
- 01-10Android 友盟第三方登錄與分享的實(shí)現(xiàn)代碼
- 01-10C++自定義API函數(shù)實(shí)現(xiàn)大數(shù)相乘算法
- 01-10如何給Flutter界面切換實(shí)現(xiàn)點(diǎn)特效
- 01-10android實(shí)現(xiàn)指紋識(shí)別功能
- 01-10Android實(shí)現(xiàn)圓形漸變加載進(jìn)度條
- 01-10RecyclerView仿應(yīng)用列表實(shí)現(xiàn)網(wǎng)格布局
- 01-10Android實(shí)現(xiàn)底部導(dǎo)航欄的主界面


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10Android自定義View之繪制圓形頭像功能
- 01-10Android實(shí)現(xiàn)雙擊返回鍵退出應(yīng)用實(shí)現(xiàn)方
- 01-10android實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
- 01-10android實(shí)現(xiàn)記住用戶名和密碼以及自動(dòng)
- 01-10C++自定義API函數(shù)實(shí)現(xiàn)大數(shù)相乘算法
- 01-10Android 友盟第三方登錄與分享的實(shí)現(xiàn)代
- 01-10android實(shí)現(xiàn)指紋識(shí)別功能
- 01-10如何給Flutter界面切換實(shí)現(xiàn)點(diǎn)特效
- 01-10Android實(shí)現(xiàn)圓形漸變加載進(jìn)度條
- 01-10Emoji表情在Android JNI中的兼容性問題詳
隨機(jī)閱讀
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10delphi制作wav文件的方法