2017-02-13 65 views
2

注:创建一个嵌套的树状

previously asked这个问题,但没有再访问该帐户也没有得到恢复的帐户的能力。如果主持人正在查看此内容,请删除我之前的问题。

问:

我使用AndroidTreeView library创建消息(基本上是嵌套式布局)的一个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 
    - 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); 

回答

0

首先,我不认为你需要有一个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; 
} 
+0

我宁愿使用'List '因为我在代码中的其他地方引用它。 – user7555980