2017-02-13 3 views
2

Примечания:Создание вложенной TreeView

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" и "Хэя" (два топ-большинство сообщений):

- Hello 
- Heya 

Вместо этого, она должна быть вывода:

- Hello 
    - Hi 
     - Hey 
    - Bye 
- Heya 

Как я могу изменить свой код, чтобы перебрать все вложенные дочерние сообщения и правильно добавить их на каждый узел?

FYI, это как дочерний узел добавляется к родительскому узлу (берется из библиотеки риого):

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

Смежные вопросы