问题描述
注意:
我这个问题,但是我无法再访问该帐户,也无法恢复该帐户。 如果主持人正在查看此内容,请删除我之前的问题。
题:
我正在使用创建消息的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
- 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);
1楼
首先,我认为您不需要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;
}