2017-02-13 64 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