Android实现RecyclerView嵌套流式布局

前言

Android开发中,列表页面是常见需求,流式布局的标签效果也是常见需求,那么两者结合的效果啥样呢?这篇文章简单实现一下。

实现过程

  1. 添加流式布局依赖,在app/build.gradle文件中添加如下代码

    implementation 'com.google.android.flexbox:flexbox:3.0.0'
  2. 新建Activity文件RecyclerViewActivity.class

    package com.example.androidstudy;
    
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.recyclerview.widget.LinearLayoutManager;
    import androidx.recyclerview.widget.RecyclerView;
    
    import android.os.Bundle;
    import android.widget.Toast;
    
    import com.example.androidstudy.adapter.MyRecyclerAdapter;
    import com.example.androidstudy.bean.TestData;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class RecyclerViewActivity extends AppCompatActivity {
    
     private RecyclerView recyclerView;
     private MyRecyclerAdapter adapter;
    
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_recycler_view);
         initViews();
         initListener();
     }
    
     private void initListener() {
         adapter.setItemCellClicker(tag -> Toast.makeText(RecyclerViewActivity.this, tag, Toast.LENGTH_SHORT).show());
     }
    
     private void initViews() {
         recyclerView = findViewById(R.id.recyclerview);
         // 设置布局管理器
         recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
         List sss = new ArrayList<>();
         sss.add("重型卡车1");
         sss.add("重车11");
         sss.add("重型卡车3445");
         sss.add("重型卡车6677");
         List sss1 = new ArrayList<>();
         sss1.add("轻型卡车1");
         sss1.add("轻车11");
         sss1.add("轻型卡车3445");
         sss1.add("轻型卡车6677");
    
         List sss2 = new ArrayList<>();
         sss2.add("其他1");
         sss2.add("其他2");
         List list = new ArrayList<>();
         list.add(new TestData("重型",sss));
         list.add(new TestData("轻型", sss1));
         list.add(new TestData("其他", sss2));
         // 实例化Adapter对象
         adapter = new MyRecyclerAdapter(this, list);
         // 设置Adapter
         recyclerView.setAdapter(adapter);
         adapter.notifyDataSetChanged();
     }
    }

    Activity页面布局activity_recycler_view.xml

    
    
    
     
    
    
  3. 创建Adapter文件MyRecyclerAdapter.class

    package com.example.androidstudy.adapter;
    
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    
    import androidx.annotation.NonNull;
    import androidx.recyclerview.widget.RecyclerView;
    
    import com.example.androidstudy.R;
    import com.example.androidstudy.bean.TestData;
    import com.google.android.flexbox.FlexboxLayout;
    
    import java.util.List;
    
    public class MyRecyclerAdapter extends RecyclerView.Adapter{
    
     private List data;
     private Context myContext;
    
     public MyRecyclerAdapter(Context context, List data) {
         this.myContext = context;
         this.data = data;
     }
    
     @NonNull
     @Override
     public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
         View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_cell, parent, false);
         return new MyViewHolder(inflate);
     }
    
     public interface ItemCellClicker{
         void onItemClick(String tag);
     }
    
      // 流式布局标签点击事件
     public ItemCellClicker itemCellClicker;
      // 设置点击事件回调
     public void setItemCellClicker(ItemCellClicker itemCellClicker){
         this.itemCellClicker = itemCellClicker;
     }
    
     @Override
     public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
         TextView title = holder.itemView.findViewById(R.id.tv_title);
         FlexboxLayout flexboxLayout = holder.itemView.findViewById(R.id.flexbox_layout);
    
         TestData data = this.data.get(position);
         List tags = data.getTag();
         flexboxLayout.removeAllViews();
         // flexbox布局动态添加标签
         for (int i = 0; i < tags.size(); i++) {
             String temp = tags.get(i);
             View tagView = LayoutInflater.from(myContext).inflate(R.layout.item_tag_cell, null, false);
             TextView tag = tagView.findViewById(R.id.tv_tag);
             tag.setText(temp);
             // 设置标签点击事件
             tag.setOnClickListener(view -> itemCellClicker.onItemClick(temp));
             flexboxLayout.addView(tagView);
         }
         title.setText(data.getTitle());
     }
    
     @Override
     public int getItemCount() {
         return data.size();
     }
    
     public static class MyViewHolder extends RecyclerView.ViewHolder{
    
         public MyViewHolder(@NonNull View itemView) {
             super(itemView);
         }
     }
    }

    列表项布局item_cell.xml

    
    
    
     
     
     
    
    

    列表中标签布局item_tag_cell.xml

    
    
     
    
    

    效果

你可能感兴趣的:(android)