当前位置: 代码迷 >> Android >> 创建一个嵌套的treeview
  详细解决方案

创建一个嵌套的treeview

热度:16   发布时间:2023-08-04 10:46:07.0

注意:

我这个问题,但是我无法再访问该帐户,也无法恢复该帐户。 如果主持人正在查看此内容,请删除我之前的问题。

题:

我正在使用创建消息的TreeView(本质上是嵌套的布局)。

在我的代码中,我有一个类似于以下内容的JSON响应:

[
    {
        "id": 2,
        "user_id": 1,
        "message": "Hello",
        "children": [
            {
                "id": 3,
                "user_id": 2,
                "message": "Hi",
                "children": [
                    {
                        "id": 5,
                        "user_id": 3,
                        "message": "Hey",
                        "children": [

                        ]
                    }
                ]
            },
            {
                "id": 6,
                "user_id": 2,
                "message": "Bye",
                "children": [

                ]
            }
        ]
    },
    {
        "id": 4,
        "user_id": 2,
        "message": "Heya",
        "children": [

        ]
    }
]

如您所见,数据可以嵌套并且在每个消息下可以有多个子代。 每个对象(包括子对象)都属于Message.java类(Gson模型类),其中包含以下内容:

public class Message implements Serializable {
    @SerializedName("id")
    @Expose
    private Integer id;
    @SerializedName("user_id")
    @Expose
    private Integer userId;
    @SerializedName("message")
    @Expose
    private String message;
    @SerializedName("children")
    @Expose
    private List<Message> children = null;

    public Integer getId() {
        return id;
    }

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

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public List<Message> getChildren() {
        return children;
    }

    public void setChildren(List<Message> children) {
        this.children = children;
    }
}

为了构建树,这是我到目前为止拥有的代码(在MainActivity.java中):

private List<Message> messages = response.body(); // the JSON response

private TreeNode root = TreeNode.root();

for (Message message : messages) {
    MessageAdapter.TreeItem messageItem = new MessageAdapter.TreeItem(message);
    TreeNode parentNode = new TreeNode(messageItem).setViewHolder(new MessageAdapter(MainActivity.this));
    root.addChild(parentNode);
}

LinearLayout messageContainer = (LinearLayout) findViewById(R.id.messageContainer);

AndroidTreeView tView = new AndroidTreeView(MainActivity.this, root);
messageContainer.addView(tView.getView());

And here is the MessageAdapter.java:

public class MessageAdapter extends TreeNode.BaseNodeViewHolder<MessageAdapter.TreeItem> {
    private Context context;

    private TextView messageTextView;

    public MessageAdapter(Context context) {
        super(context);
        this.context = context;
    }

    @Override
    public View createNodeView(TreeNode node, TreeItem value) {
        final LayoutInflater inflater = LayoutInflater.from(context);
        final View view = inflater.inflate(R.layout.message_layout, null, false);

        Message message = value.message;

        messageTextView = (TextView) view.findViewById(R.id.messageTextView);
        messageTextView.setText(message.getMessage());

        return view;
    }

    public static class TreeItem {
        public Message message;

        public TreeItem(Message message) {
            this.message = message;
        }
    }
}

我的代码的问题在于,它仅输出“ Hello”和“ Heya”(两个最上面的消息):

- Hello
- Heya

相反,它应该输出:

- Hello
    - Hi
        - Hey
    - Bye
- Heya

如何更改代码以遍历所有嵌套的子消息并将它们正确添加到每个节点?

仅供参考,这是将子节点添加到父节点的方式(摘自库自述文件):

TreeNode parent = new TreeNode("MyParentNode");
TreeNode child0 = new TreeNode("ChildNode0");
TreeNode child1 = new TreeNode("ChildNode1");
parent.addChildren(child0, child1);
root.addChild(parent);

首先,我认为您不需要List<Messages> ,将JSON转换为树会更容易。

JSONArray arr = new JSONArray(response);

for (int i = 0; i < arr.length(); i++) {
     root.addChild(decodeMessages(arr.getJSONObject(i)));
}

private String decodeMessages(JSONObject jsonObject) {
    TreeNode treeNode;
    // decode message from json
    try {
        JSONArray jsonArray = jsonObject.getJSONArray("children");
        for (int i = 0; i < jsonArray.length(); i++) {
            treeNode.addChild(decodeMessages(jsonArray.getJSONObject(i)));
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }

    return treeNode;
}
  相关解决方案