You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Expandable RecyclerView:如何为每个父项配置不同子项?

解决Expandable RecyclerView父项子项重复的问题

嘿,我来帮你搞定这个问题!你现在遇到的情况是因为在遍历父项时,每个父项都被设置了完全相同的子项列表——不管是哪个父项,都只添加了new TitleChild("Combe","Send message")这一个子项,所以所有父项展开后内容自然一模一样。

下面给你几种不同的解决方案,你可以根据自己的需求来选:

方案1:根据父项标题匹配不同子项

如果每个父项的子项是固定且明确的,可以通过父项的标题来区分,给每个父项分配对应的子项:

private List<ParentObject> initData() {
    TitleCreator titleCreator = TitleCreator.get(this);
    List<TitleParent> titles = titleCreator.getAll();
    List<ParentObject> parentObject = new ArrayList<>();
    
    for(TitleParent title : titles) {
        List<Object> childList = new ArrayList<>();
        // 假设TitleParent有getTitle()方法可以获取它的标题文本
        switch(title.getTitle()) {
            case "Option 1":
                childList.add(new TitleChild("Alice", "Send message"));
                childList.add(new TitleChild("Bob", "Send message"));
                break;
            case "Option 2":
                childList.add(new TitleChild("Charlie", "Send message"));
                break;
            case "Option 3":
                childList.add(new TitleChild("Diana", "Send message"));
                childList.add(new TitleChild("Eve", "Send message"));
                break;
            case "Option 4":
                childList.add(new TitleChild("Grace", "Send message"));
                break;
            case "Option 5":
                childList.add(new TitleChild("Henry", "Send message"));
                childList.add(new TitleChild("Iris", "Send message"));
                break;
            default:
                // 处理意外情况,添加默认子项
                childList.add(new TitleChild("Default Contact", "Send message"));
        }
        title.setChildObjectList(childList);
        parentObject.add(title);
    }
    return parentObject;
}

方案2:根据父项索引生成规律化子项

如果子项内容有规律(比如父项的索引决定子项数量或命名),可以利用循环索引来动态生成:

private List<ParentObject> initData() {
    TitleCreator titleCreator = TitleCreator.get(this);
    List<TitleParent> titles = titleCreator.getAll();
    List<ParentObject> parentObject = new ArrayList<>();
    
    for(int i = 0; i < titles.size(); i++) {
        TitleParent title = titles.get(i);
        List<Object> childList = new ArrayList<>();
        // 比如第i个父项(从0开始)对应i+1个子项,命名按规则生成
        for(int j = 0; j < i + 1; j++) {
            childList.add(new TitleChild(String.format("Contact %d-%d", i+1, j+1), "Send message"));
        }
        title.setChildObjectList(childList);
        parentObject.add(title);
    }
    return parentObject;
}

方案3:提前在TitleCreator中预设子项

如果父项和子项的对应关系是固定不变的,你可以直接在创建父项的时候就把对应的子项配置好,这样MainActivity里的代码会更简洁:

先修改TitleCreator的构造方法:

public TitleCreator(Context context) { 
    _titleParents = new ArrayList<>(); 
    
    // 配置Option 1及其子项
    TitleParent title = new TitleParent("Option 1");
    List<Object> child1 = new ArrayList<>();
    child1.add(new TitleChild("Alice", "Send message"));
    child1.add(new TitleChild("Bob", "Send message"));
    title.setChildObjectList(child1);
    _titleParents.add(title);
    
    // 配置Option 2及其子项
    TitleParent title1 = new TitleParent("Option 2");
    List<Object> child2 = new ArrayList<>();
    child2.add(new TitleChild("Charlie", "Send message"));
    title1.setChildObjectList(child2);
    _titleParents.add(title1);
    
    // 配置Option 3及其子项
    TitleParent title2 = new TitleParent("Option 3");
    List<Object> child3 = new ArrayList<>();
    child3.add(new TitleChild("Diana", "Send message"));
    child3.add(new TitleChild("Eve", "Send message"));
    title2.setChildObjectList(child3);
    _titleParents.add(title2);
    
    // 配置Option 4及其子项
    TitleParent title3 = new TitleParent("Option 4");
    List<Object> child4 = new ArrayList<>();
    child4.add(new TitleChild("Grace", "Send message"));
    title3.setChildObjectList(child4);
    _titleParents.add(title3);
    
    // 配置Option 5及其子项
    TitleParent title4 = new TitleParent("Option 5");
    List<Object> child5 = new ArrayList<>();
    child5.add(new TitleChild("Henry", "Send message"));
    child5.add(new TitleChild("Iris", "Send message"));
    title4.setChildObjectList(child5);
    _titleParents.add(title4);
}

然后MainActivity的initData方法可以简化成这样:

private List<ParentObject> initData() {
    TitleCreator titleCreator = TitleCreator.get(this);
    // 直接把所有预设好子项的父项转成ParentObject列表
    return new ArrayList<>(titleCreator.getAll());
}

以上三种方案都能解决你的问题,你可以根据自己项目的实际需求来选择最合适的一种~

内容的提问来源于stack exchange,提问作者XcombeX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:28:36