RecyclerView實現(xiàn)流式標簽單選多選功能
RecyclerView簡介
RecyclerView是Android一個更強大的控件,其不僅可以實現(xiàn)和ListView同樣的效果,還有優(yōu)化了ListView中的各種不足。其可以實現(xiàn)數(shù)據(jù)縱向滾動,也可以實現(xiàn)橫向滾動(ListView做不到橫向滾動)。接下來講解RecyclerView的用法。
RecyclerView 基本用法
因為RecyclerView屬于新增的控件,Android將RecyclerView定義在support庫里。若要使用RecyclerView,第一步是要在build.gradle中添加對應的依賴庫。
一、實現(xiàn)效果
單選效果:

多選效果:

二、前期準備
依賴的添加:
//瀑布流LayoutManager implementation 'com.google.android:flexbox:1.0.0' //RecyclerView implementation 'com.android.support:design:28.0.0'
三、使用方法
3.1、多選的實現(xiàn)
1、使用集合存儲需要存儲或者展示的數(shù)據(jù)
public static Set<Integer> positionSet = new HashSet<>(); //用于存儲選擇的位置 private boolean selectMode = true; //選擇模式 多選或者單選 true 多選 public Set<String> checkTYpeNameSet = new HashSet<>(); //用于存儲選擇項的名稱
2、實現(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、單條點擊事件的處理
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的使用說明:
實現(xiàn)了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、單選的實現(xiàn)
單選和多選的代碼幾乎完全一致, 只需要修改一部分
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) {
// 如果當前處于多選狀態(tài),則進入多選狀態(tài)的邏輯
// 維護當前已選的position
addOrRemove(position);
} else {
// 如果不是多選狀態(tài),則進入單選事件的業(yè)務邏輯
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中數(shù)據(jù)綁定的集合需要更換

其他的都是一樣的了:
附上DEMO下載地址:
GITHUB:https://github.com/muyexiaogui/FlowTagDemo
總結
以上所述是小編給大家介紹的RecyclerView實現(xiàn)流式標簽單選多選功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!
相關文章
淺析Android企業(yè)級開發(fā)數(shù)據(jù)綁定技術
這篇文章通過代碼實例分析了Android企業(yè)級開發(fā)數(shù)據(jù)綁定技術的應用以及相關的原理知識,跟著小編一起學習參考下吧。2017-12-12
講解Android中的Widget及AppWidget小工具的創(chuàng)建實例
這篇文章主要介紹了講解Android中的Widget及Widget的創(chuàng)建實例,文中的例子展示了通過RemoteView來溝通AppWidgetProvider與AppWidgetHostView的方法,需要的朋友可以參考下2016-03-03
Android開發(fā)實現(xiàn)在Wifi下獲取本地IP地址的方法
這篇文章主要介紹了Android開發(fā)實現(xiàn)在Wifi下獲取本地IP地址的方法,涉及Android編程Wifi的調用及IP地址的獲取與轉換相關操作技巧,需要的朋友可以參考下2017-09-09

