【问题标题】:Creating a nested treeview创建嵌套树视图
【发布时间】:2017-02-13 05:51:35
【问题描述】:

注意:

previously asked这个问题,但我不再有权访问该帐户,也无法恢复该帐户。如果版主正在查看此内容,请删除我之前的问题。

问题:

我正在使用AndroidTreeView library 创建消息树视图(基本上是嵌套布局)。

在我的代码中,我有一个如下所示的 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);

【问题讨论】:

    标签: java android android-layout android-activity treeview


    【解决方案1】:

    首先,我认为您不需要List&lt;Messages&gt;,将 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;
    }
    

    【讨论】:

    • 我宁愿使用List&lt;Messages&gt;,因为我在代码的其他地方也提到了它。
    猜你喜欢
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多