2017-02-13 4 views
2

Hinweis:Erstellen einer verschachtelten treeview

ich previously asked diese Frage, aber keinen Zugriff mehr auf das Konto noch habe ich die Möglichkeit, das Konto wiederherzustellen. Wenn ein Moderator dies anzeigt, lösche bitte meine vorherige Frage.

Frage:

Ich AndroidTreeView library mit einem TreeView von Nachrichten zu erstellen (im Wesentlichen verschachtelt Layouts).

In meinem Code habe ich eine JSON-Antwort, die etwa wie folgt aussieht:

[ 
    { 
     "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": [ 

     ] 
    } 
] 

Wie Sie sehen können, können die Daten verschachtelt werden und mehrere Kinder unter jeder Nachricht haben kann. Jedes Objekt (einschließlich der Kinder) ist der Klasse Message.java (die Gson Modellklasse), die enthält:

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; 
    } 
} 

Um den Baum zu bauen, hier ist der Code, den ich bisher haben (in 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; 
     } 
    } 
} 

Das Problem mit meinem Code ist, dass es nur gibt "Hallo" und "Heya" (die beiden meisten Top-Nachrichten):

- Hello 
- Heya 

Stattdessen sollte es sein Ausgabe:

Wie kann ich meinen Code so ändern, dass er alle verschachtelten untergeordneten Nachrichten durchläuft und sie jedem Knoten richtig hinzufügt?

FYI, das ist wie ein Kind-Knoten zu einem übergeordneten Knoten hinzugefügt wird (aus der Bibliothek readme genommen):

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

Antwort

0

Zunächst einmal glaube ich nicht, dass Sie ein List<Messages> haben müssen es sein wird, einfacher, einfach den JSON in einen Baum zu konvertieren.

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

Ich würde lieber 'List ' verwenden, weil ich es an anderer Stelle in meinem Code auch beziehe. – user7555980

Verwandte Themen