RecycleView嵌套实现多级列表

RecycleView嵌套RecycleView实现多级列表,点击按钮实现折叠效果,自定义每一级布局。

附上代码,可以直接使用。布局文件放到最后面。

ItemModel 

import java.util.List;

public class ItemModel {
    private String title;
    private List<ItemModel> subItemList;

    public ItemModel(String title, List<ItemModel> subItemList) {
        this.title = title;
        this.subItemList = subItemList;
    }

    public String getTitle() {
        return title;
    }

    public List<ItemModel> getSubItemList() {
        return subItemList;
    }
}
ItemLevel1Adapter和Level1ViewHolder

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;



import java.util.List;

public class ItemLevel1Adapter extends RecyclerView.Adapter<ItemLevel1Adapter.Level1ViewHolder> {

    private List<ItemModel> itemList;

    public ItemLevel1Adapter(List<ItemModel> itemList) {
        this.itemList = itemList;
    }

    @NonNull
    @Override
    public Level1ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_level_1_layout, parent, false);
        return new Level1ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull Level1ViewHolder holder, int position) {
        ItemModel item = itemList.get(position);
        holder.bind(item);
    }

    @Override
    public int getItemCount() {
        return itemList.size();
    }

    static class Level1ViewHolder extends RecyclerView.ViewHolder {
        private TextView level1TitleTextView;
        private Button level1CollapseButton;
        private RecyclerView level1RecyclerView;

        Level1ViewHolder(@NonNull View itemView) {
            super(itemView);
            level1TitleTextView = itemView.findViewById(R.id.level1TitleTextView);
            level1CollapseButton = itemView.findViewById(R.id.level1CollapseButton);
            level1RecyclerView = itemView.findViewById(R.id.level1RecyclerView);
            level1RecyclerView.setLayoutManager(new LinearLayoutManager(itemView.getContext()));
        }

        void bind(ItemModel item) {
            level1TitleTextView.setText(item.getTitle());
            ItemLevel2Adapter adapter = new ItemLevel2Adapter(item.getSubItemList());
            level1RecyclerView.setAdapter(adapter);

            level1CollapseButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (level1RecyclerView.getVisibility() == View.VISIBLE) {
                        level1RecyclerView.setVisibility(View.GONE);
                        level1CollapseButton.setText("Expand");
                    } else {
                        level1RecyclerView.setVisibility(View.VISIBLE);
                        level1CollapseButton.setText("Collapse");
                    }
                }
            });
        }
    }
}

ItemLevel2Adapter和Level2ViewHolder和ItemLevel1Adapter和Level1ViewHolder类似

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class ItemLevel2Adapter extends RecyclerView.Adapter<ItemLevel2Adapter.Level2ViewHolder> {

    private List<ItemModel> itemList;

    public ItemLevel2Adapter(List<ItemModel> itemList) {
        this.itemList = itemList;
    }

    @NonNull
    @Override
    public Level2ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_level_2_layout, parent, false);
        return new Level2ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull Level2ViewHolder holder, int position) {
        ItemModel item = itemList.get(position);
        holder.bind(item);
    }

    @Override
    public int getItemCount() {
        return itemList.size();
    }

    static class Level2ViewHolder extends RecyclerView.ViewHolder {
        private TextView level2TitleTextView;
        private Button level2CollapseButton;
        private RecyclerView level2RecyclerView;

        Level2ViewHolder(@NonNull View itemView) {
            super(itemView);
            level2TitleTextView = itemView.findViewById(R.id.level2TitleTextView);
            level2CollapseButton = itemView.findViewById(R.id.level2CollapseButton);
            level2RecyclerView = itemView.findViewById(R.id.level2RecyclerView);
            level2RecyclerView.setLayoutManager(new LinearLayoutManager(itemView.getContext()));
        }

        void bind(ItemModel item) {
            level2TitleTextView.setText(item.getTitle());
            ItemLevel3Adapter adapter = new ItemLevel3Adapter(item.getSubItemList());
            level2RecyclerView.setAdapter(adapter);

            level2CollapseButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (level2RecyclerView.getVisibility() == View.VISIBLE) {
                        level2RecyclerView.setVisibility(View.GONE);
                        level2CollapseButton.setText("Expand");
                    } else {
                        level2RecyclerView.setVisibility(View.VISIBLE);
                        level2CollapseButton.setText("Collapse");
                    }
                }
            });
        }
    }
}

在activity或者fragment内使用

    public void initRecycleList(){
        RecyclerView recyclerView = binding.getRoot().findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        List<ItemModel> level1List = new ArrayList<>();
        level1List.add(new ItemModel("Level 1 Item 1", generateLevel2List()));
        level1List.add(new ItemModel("Level 1 Item 2", generateLevel2List()));

        ItemLevel1Adapter adapter = new ItemLevel1Adapter(level1List);
        recyclerView.setAdapter(adapter);
    }

    private List<ItemModel> generateLevel2List() {
        List<ItemModel> level2List = new ArrayList<>();
        level2List.add(new ItemModel("Level 2 Item 1", generateLevel3List()));
        level2List.add(new ItemModel("Level 2 Item 2", generateLevel3List()));
        return level2List;
    }

    private List<ItemModel> generateLevel3List() {
        List<ItemModel> level3List = new ArrayList<>();
        level3List.add(new ItemModel("Level 3 Item 1", null));
        level3List.add(new ItemModel("Level 3 Item 2", null));
        return level3List;
    }

item_level_1_layout.xml,子布局类似

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:id="@+id/level1TitleTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Level 1 Title"
        android:textSize="18sp"
        android:textColor="@android:color/black"/>

    <Button
        android:id="@+id/level1CollapseButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:text="Collapse" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/level1RecyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingStart="16dp"
        android:paddingTop="8dp"/>

</LinearLayout>

完成!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值