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
相关产品推荐
相关产品推荐

