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>
完成!