要创建可展开的RecyclerView以显示类别和子类别,您可以使用ExpandableRecyclerView库来简化实现过程。以下是使用Retrofit2和ExpandableRecyclerView库的示例代码:
首先,在您的build.gradle文件中添加以下依赖项:
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0'
implementation 'com.google.android.material:material:1.4.0'
implementation 'com.github.thoughtbot:expandablerecyclerview:1.4'
接下来,创建一个类别模型类和子类别模型类:
public class Category {
private String name;
private List subCategories;
// getters and setters
}
public class SubCategory {
private String name;
// getters and setters
}
然后,创建一个Retrofit接口来获取您的类别和子类别数据:
public interface ApiService {
@GET("categories")
Call> getCategories();
}
接下来,创建一个数据适配器来填充展开的RecyclerView:
public class CategoryAdapter extends ExpandableRecyclerViewAdapter {
private Context context;
private List categories;
public CategoryAdapter(Context context, List categories) {
super(categories);
this.context = context;
this.categories = categories;
}
@Override
public int getParentViewType(int parentPosition) {
return 0;
}
@Override
public int getChildViewType(int parentPosition, int childPosition) {
return 0;
}
@Override
public CategoryViewHolder onCreateParentViewHolder(ViewGroup parentViewGroup, int viewType) {
View categoryView = LayoutInflater.from(context).inflate(R.layout.item_category, parentViewGroup, false);
return new CategoryViewHolder(categoryView);
}
@Override
public SubCategoryViewHolder onCreateChildViewHolder(ViewGroup childViewGroup, int viewType) {
View subCategoryView = LayoutInflater.from(context).inflate(R.layout.item_subcategory, childViewGroup, false);
return new SubCategoryViewHolder(subCategoryView);
}
@Override
public void onBindParentViewHolder(CategoryViewHolder categoryViewHolder, int parentPosition, ExpandableGroup parent) {
Category category = (Category) parent;
categoryViewHolder.setCategoryTitle(category.getName());
}
@Override
public void onBindChildViewHolder(SubCategoryViewHolder subCategoryViewHolder, int parentPosition, int childPosition, ExpandableGroup parent) {
Category category = (Category) parent;
SubCategory subCategory = category.getItems().get(childPosition);
subCategoryViewHolder.setSubCategoryTitle(subCategory.getName());
}
@Override
public int getItemCount() {
return categories.size();
}
}
创建CategoryViewHolder和SubCategoryViewHolder来管理类别和子类别视图的显示:
public class CategoryViewHolder extends GroupViewHolder {
private TextView categoryTitleTextView;
public CategoryViewHolder(View itemView) {
super(itemView);
categoryTitleTextView = itemView.findViewById(R.id.category_title);
}
public void setCategoryTitle(String title) {
categoryTitleTextView.setText(title);
}
}
public class SubCategoryViewHolder extends ChildViewHolder {
private TextView subCategoryTitleTextView;
public SubCategoryViewHolder(View itemView) {
super(itemView);
subCategoryTitleTextView = itemView.findViewById(R.id.subcategory_title);
}
public void setSubCategoryTitle(String title) {
subCategoryTitleTextView.setText(title);
}
}
最后,在您的Activity或Fragment中,使用Retrofit获取数据并设置RecyclerView的适配器:
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private CategoryAdapter categoryAdapter;
private ApiService apiService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
apiService = RetrofitClient.getClient().create(ApiService.class);
Call> call = apiService.getCategories();
call.enqueue(new Callback>() {
@Override
public void onResponse(Call> call, Response> response) {
List categories = response.body();
categoryAdapter = new CategoryAdapter(MainActivity.this, categories);
recyclerView.setAdapter(categoryAdapter);
}
@Override
public void onFailure(Call> call, Throwable t) {
Toast.makeText(MainActivity.this, "Error loading categories", Toast.LENGTH