【问题标题】:List structure logic to show in Recyclerview要在 Recyclerview 中显示的列表结构逻辑
【发布时间】:2020-11-18 05:37:28
【问题描述】:

我有一个 JSON 数组,它需要以与所附屏幕截图相似的方式进行解析。因此,例如,JSON 数组将在下面给出,它有六个元素需要使用循环解析但无法生成正确的数据结构。有不同的级别,如果孩子有一个共同的父母,那么它只需要使用该父母 ID 进行管理。对于级别 1,将没有父 ID

JSON 数组

"clubSubAreas":[
{
"id":573801,
"clubId":16733,
"areaId":58482,
"name":"subcoach c2a",
"level":4,
"parentId":569125,
"clubMemberSubAreas":{}
},
{
"id":569114,
"clubId":16733,
"areaId":53279,
"name":"Hockey",
"level":1,
"parentId":null,
"clubMemberSubAreas":{}
},
{
"id":569122,
"clubId":16733,
"areaId":53280,
"name":"Team H2",
"level":2,
"parentId":569114,
"clubMemberSubAreas":{}
},
{
"id":569131,
"clubId":16733,
"areaId":53281,
"name":"Coach H2",
"level":3,
"parentId":569122,
"clubMemberSubAreas":{}
},
{
"id":569119,
"clubId":16733,
"areaId":53280,
"name":"Team F2",
"level":2,
"parentId":569112,
"clubMemberSubAreas":{}
},
{
"id":569127,
"clubId":16733,
"areaId":53281,
"name":"Coach F1",
"level":3,
"parentId":569118,
"clubMemberSubAreas":{}
},
{
"id":569851,
"clubId":16733,
"areaId":58482,
"name":"sub coach f1",
"level":4,
"parentId":569127,
"clubMemberSubAreas":{}
},
{
"id":569112,
"clubId":16733,
"areaId":53279,
"name":"Football",
"level":1,
"parentId":null,
"clubMemberSubAreas":{}
},
{
"id":569118,
"clubId":16733,
"areaId":53280,
"name":"Team F1",
"level":2,
"parentId":569112,
"clubMemberSubAreas":{}
},
{
"id":569716,
"clubId":16733,
"areaId":58482,
"name":"subcoasch c2",
"level":4,
"parentId":569125,
"clubMemberSubAreas":{}
},
{
"id":569125,
"clubId":16733,
"areaId":53281,
"name":"Coach C2",
"level":3,
"parentId":569116,
"clubMemberSubAreas":{}
},
{
"id":569116,
"clubId":16733,
"areaId":53280,
"name":"Team C2",
"level":2,
"parentId":569113,
"clubMemberSubAreas":{}
},
{
"id":573787,
"clubId":16733,
"areaId":58482,
"name":"subcoach c2 new",
"level":4,
"parentId":573786,
"clubMemberSubAreas":{}
},
{
"id":573786,
"clubId":16733,
"areaId":53281,
"name":"Coach C2 new",
"level":3,
"parentId":569116,
"clubMemberSubAreas":{}
},
{
"id":569113,
"clubId":16733,
"areaId":53279,
"name":"Cricket",
"level":1,
"parentId":null,
"clubMemberSubAreas":{}
}
]

基本上,我想在回收器视图中显示数据,但无法从给定的 JSON 响应中使用 ArrayList/Hashmap/TreeMap 制作数据结构

我的工作:

 ArrayList<ClubSubArea> clubSubAreaDept = new ArrayList<>();
        ArrayList<ClubSubArea> clubSubAreaSubDept = new ArrayList<>();
        ArrayList<ClubSubArea> clubSubAreaFunc = new ArrayList<>();
        ArrayList<ClubSubArea> clubSubAreaLevelFour = new ArrayList<>();
        for (ClubSubArea clubSubArea : clubMemberDataEdit.getClubSubAreas()) {
            if (clubSubArea.getLevel() == 1) {
                clubSubAreaDept.add(clubSubArea);
            } else if (clubSubArea.getLevel() == 2) {
                clubSubAreaSubDept.add(clubSubArea);
            } else if (clubSubArea.getLevel() == 3) {
                clubSubAreaFunc.add(clubSubArea);
            } else {
                clubSubAreaLevelFour.add(clubSubArea);
            }
        }
        ArrayList<ClubAreaCombine> clubAreaCombines1 = new ArrayList<>();
        ArrayList<ClubAreaCombine> clubAreaCombines = new ArrayList<>();
        if (clubAreas != null && clubAreas.size() > 0) {
            for (ClubSubArea clubSubAreaDepartment : clubSubAreaDept) {
                for (ClubSubArea clubSubAreaSubDepartment : clubSubAreaSubDept) {
                    if (clubSubAreaSubDepartment.getParentId() == clubSubAreaDepartment.getId()) {
                        for (ClubSubArea clubSubAreaFunction : clubSubAreaFunc) {
                            if (clubSubAreaFunction.getParentId() == clubSubAreaSubDepartment.getId()) {

                                if (clubSubAreaLevelFour != null && clubSubAreaLevelFour.size() > 0) {
                                    for (ClubSubArea clubSubAreaLFour : clubSubAreaLevelFour) {
                                        if (clubSubAreaLFour.getParentId() == clubSubAreaFunction.getId()) {
                                            ClubAreaCombine clubAreaCombine = new ClubAreaCombine(clubSubAreaDepartment,
                                                    clubSubAreaSubDepartment,
                                                    clubSubAreaFunction,
                                                    clubSubAreaLFour);
                                            clubAreaCombines1.add(clubAreaCombine);
                                        } else {
                                            ClubAreaCombine clubAreaCombine = new ClubAreaCombine(clubSubAreaDepartment,
                                                    clubSubAreaSubDepartment,
                                                    clubSubAreaFunction, null);
                                            clubAreaCombines1.add(clubAreaCombine);
                                        }
                                    }

                                } else {
                                    ClubAreaCombine clubAreaCombine = new ClubAreaCombine(clubSubAreaDepartment,
                                            clubSubAreaSubDepartment,
                                            clubSubAreaFunction,
                                            null);
                                    clubAreaCombines1.add(clubAreaCombine);
                                }
                            } else {
                                ClubAreaCombine clubAreaCombine = new ClubAreaCombine(clubSubAreaDepartment,
                                        clubSubAreaSubDepartment,
                                        null,
                                        null);
                                clubAreaCombines1.add(clubAreaCombine);
                            }
                        }
                    } else {
                        ClubAreaCombine clubAreaCombine = new ClubAreaCombine(clubSubAreaDepartment,
                                null,
                                null,
                                null);
                        clubAreaCombines1.add(clubAreaCombine);
                    }
                }
            }
        }



        for (ClubAreaCombine clubAreaCombine : clubAreaCombines1) {
            if (!clubAreaCombines.contains(clubAreaCombine)) {
                clubAreaCombines.add(clubAreaCombine);
            }
        }

俱乐部子区

public class ClubSubArea implements Serializable {
    @SerializedName("id")
    private long id;
    @SerializedName("clubId")
    private Long clubId;
    @SerializedName("name")
    private String name;
    @SerializedName("level")
    private int level;
    @SerializedName("areaId")
    private Long areaId;
    @SerializedName("parentId")
    private Long parentId;
    @SerializedName("_links")
    List<Links> links;
    List<ClubSubArea> subAreaList = new ArrayList<>();
    @SerializedName("clubMemberSubAreas")
    ClubMemberSubAreas clubMemberSubAreas;




    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public Long getClubId() {
        return clubId;
    }

    public void setClubId(Long clubId) {
        this.clubId = clubId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }

    public Long getAreaId() {
        return areaId;
    }

    public void setAreaId(Long areaId) {
        this.areaId = areaId;
    }

    public Long getParentId() {
        return parentId;
    }

    public void setParentId(Long parentId) {
        this.parentId = parentId;
    }

    public List<Links> getLinks() {
        return links;
    }

    public void setLinks(List<Links> links) {
        this.links = links;
    }

    public List<ClubSubArea> getSubAreaList() {
        return subAreaList;
    }

    public void setSubAreaList(ArrayList<ClubSubArea> subAreaList) {
        this.subAreaList = subAreaList;
    }

    public ClubMemberSubAreas getClubMemberSubAreas() {
        return clubMemberSubAreas;
    }

    public void setClubMemberSubAreas(ClubMemberSubAreas clubMemberSubAreas) {
        this.clubMemberSubAreas = clubMemberSubAreas;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        ClubSubArea that = (ClubSubArea) o;

        if (id != that.id) return false;
        if (level != that.level) return false;
        if (!clubId.equals(that.clubId)) return false;
        return parentId != null ? parentId.equals(that.parentId) : that.parentId == null;
    }

    @Override
    public int hashCode() {
        int result = (int) (id ^ (id >>> 32));
        result = 31 * result + clubId.hashCode();
        result = 31 * result + level;
        result = 31 * result + (parentId != null ? parentId.hashCode() : 0);
        return result;
    }
}

网络上显示的数据如下

【问题讨论】:

  • 请展示你的作品。
  • @IntelliJAmiya 添加了我的工作

标签: android arraylist android-recyclerview


【解决方案1】:

试试下面的。我没有测试它,所以可能有一些错误。 (我已将您的 ClubSubArea 更改为公开所有字段,而不必使用 getter/setter)

class CrazyMapper {

    List<RowItem> map(List<ClubSubArea> items) {
        // We return an empty list if there is no items.
        if (items.size() == 0) {
            return new ArrayList<>();
        }

        // We create a list with all the last elements (the ones not used as parent)
        List<ClubSubArea> children = new ArrayList<>();
        for (ClubSubArea club : items) {
            if (isChild(club, items)) {
                children.add(club);
            }
        }

        // Then we remove all the children ClubSubArea from the items list
        items.removeAll(children);

        // Now we want to build each row.
        // Each row is a list of ClubSubArea. In your example, one will be Cricket, then Team, then Captain...
        // We want them in that order. According to your Json, the Coach is the one with the level max,
        // then the Captain, then the Team, then Cricket.
        // Cricket has no parent but otherwise, Coach has Captain id as a parent, and Captain has
        // Teams id as a parent.
        // With buildRowList we gonna create the list in that order (Cricket, Team,...) using the parent id.
        List<RowItem> rowItems = new ArrayList<>();
        for (ClubSubArea club : children) {
            List<ClubSubArea> result = new ArrayList<>();
            result.add(club);
            buildRowList(items, club, result);
            rowItems.add(new RowItem(result));
        }

        return rowItems;
    }

    // Check if the item is used as parent in another one in the list. If not, it's the last
    // element (child).
    private boolean isChild(ClubSubArea item, List<ClubSubArea> items) {
        for (ClubSubArea club : items) {
            if (club.parentId == item.id) {
                return false;
            }
        }
        return true;
    }

    // This method is recursive (it calls itself until it can't (parent id is null)).
    private void buildRowList(List<ClubSubArea> list, ClubSubArea current, List<ClubSubArea> result) {
        for (ClubSubArea club : list) {
            if (club.id == current.parentId) {
                // We add the parent at index 0 in order to have the list starting with the highest
                // parent (parent with no parent id (should be the one with level 1))
                result.add(0, club);
                if (club.parentId != null) {
                    // We try to find the parent's parent.
                    buildRowList(list, club, result);
                }
                // We don't want to continue to loop if we found the parent
                return;
            }
        }
    }
}

// This is the class used by the adapter. The adapter will handle a list of RowItem.
class RowItem {
    public RowItem(List<ClubSubArea> items) {
        this.items = items;
    }

    List<ClubSubArea> items;
}

【讨论】:

  • 如果级别为四,它会完美运行,但在级别小于四的情况下,它不会为此创建一行。例如,我有多达三个级别的数据,例如 Football、Team F1 和 Captain F1,那么它不会为此创建一行
  • max为3的数据和max为4的数据是混在一起的吗?
  • 是的,这可能取决于用户,他想要添加多少级别的数据。假设他添加了 Cricket,那么最高级别将为 1,如果他添加 Cricket,Team1,则最高级别将为 2,就像这样......
  • @Salmankhan 我已经更新了上面的内容。现在RowItem 将包含一个大小不同的列表,具体取决于用户选择的内容
  • 该死的逻辑人。非常感谢你,它现在工作得很好。再次非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多