使用JSONObject创建有序的数组

时间:2016-01-13 10:44:22

标签: java android arrays json

让我解释一下我的问题。 (我是java的新手,所以也许这种类型的东西可能很容易,但我无法弄清楚!)

我有一个JSONObject,看起来像:

    {  
      notes:[  
       {  
         "scolaryear":2013,
         "codemodule":"B-CPE-042",
         "titlemodule":"B1 - Unix & C Lab Seminar",
         "codeinstance":"NCE-1-1",
         "codeacti":"acti-134315",
         "title":"Piscine Jour 1",
         "date":"2013-10-04 13:33:51",
         "correcteur":"ramassage-tek",
         "final_note":0,
         "comment":"Ex_00 -> output differs"
       },
       {} // And so on .. 
      ] 
    }

现在我可以获得所有数据:

try {
 // Pulling items from the array
 JSONArray notesArr = jsonObject.getJSONArray("notes");
 try {
  ListView lv = (ListView) _modulesActivity.findViewById(R.id.listView);
  List < String > notesList = new ArrayList < String > ();
  for (int i = 0; i < notesArr.length(); i++) {
   JSONObject tmp = notesArr.getJSONObject(i);
   String code_module = tmp.getString("codemodule");
   String module = tmp.getString("titlemodule");
   String title = tmp.getString("title");
   String final_note = tmp.getString("final_note");
   String year = tmp.getString("scolaryear");
   String comment = tmp.getString("comment");

   String display = year + " | " + title + " | " + final_note;
   notesList.add(display);
  }
  ArrayAdapter < String > arrayAdapter = new ArrayAdapter < String > (
   _mainContext, android.R.layout.simple_list_item_1, notesList);

  lv.setAdapter(arrayAdapter);

 } catch (JSONException e) {
  e.printStackTrace();
  Toast.makeText(_mainContext, "Error: " + e.getMessage(), Toast.LENGTH_LONG).show();
 }

} catch (JSONException e) {
 e.printStackTrace();
 Toast.makeText(_mainContext, "Error: " + e.getMessage(), Toast.LENGTH_LONG).show();
}

因此,通过这种技术,我将所有数据放在一个数组中,并且只有listView,它看起来像:

  • 2014 |项目#1 | 13/20
  • 2015 |项目#2 | 20/20

但我需要用年份和模块来订购我的数据。

看起来像是:

> YEAR (year)
   > TITLE OF MODULE (module) - MODULE CODE (codemodule)
     > PROJECT NAME (title) | MARK (final_note)
       - COMMENT (comment)

你有一年的第一个标题,当你点击一年时,你可以看到所有的模块:

> MODULE #1
> MODULE #2 
...

当您点击模块时,您可以看到所有项目:

> PROJECT #1 | MARK : 20
> PROJECT #2 | MARK : 13 
...

最后,当您点击项目时,您可以看到评论!

^ PROJECT #1 | MARK : 20 
   - Great project .. bla bla bla 

(或者如果可能的话,可能会显示一个包含评论的弹出窗口)

我知道这可能是一件很复杂的事情,但我真的很想实现这一目标!

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

在我看来,你有两种可能性:

  1. 实现Note Java对象,在表单初始化此对象并将它们放在ArrayList中。最后用一些算法对它进行排序。 例如,它看起来像:

    List<Note> notesList = new ArrayList<Note>();
    for (int i = 0; i < notesArr.length(); i++) {
        JSONObject tmp = notesArr.getJSONObject(i);
        noteListe.add(new Note(tmp.getString("codemodule"), tmp.getString("titlemodule"),...);
    }
    

    现在使用适当的方法对其进行排序,最后打印它可能会覆盖toString()注意方法。

  2. 如果可能,在创建JsonObjectArray时对其进行排序。

  3. 希望它可以帮到你

答案 1 :(得分:0)

所以我找到了解决方案!

我使用了这个库:https://github.com/bmelnychuk/AndroidTreeView

这是我的代码:

try {
 // Pulling items from the array
 TreeNode root = TreeNode.root();
 TreeNode child;
 String year = "YEAR";
 String moduleName = "";
 YearHolder.IconTreeItem nodeItem = new YearHolder.IconTreeItem(1, year);
 ModuleHolder.IconTreeItem nodeModule = new ModuleHolder.IconTreeItem(1, moduleName);
 TreeNode parent = new TreeNode(nodeItem).setViewHolder(new YearHolder(_mainContext));
 TreeNode parentModule = new TreeNode(nodeModule).setViewHolder(new ModuleHolder(_mainContext));
 JSONArray modArr = jsonObject.getJSONArray("notes");
 try {
  for (int i = 0; i < modArr.length(); i++) {
   JSONObject tmp = modArr.getJSONObject(i);
   /*String title = tmp.getString("title");*/
   String final_note = tmp.getString("final_note");
   String newModuleName = tmp.getString("titlemodule");
   String newYear = tmp.getString("scolaryear");
   if (!(newYear.equals(year))) {
    year = newYear;
    nodeItem = new YearHolder.IconTreeItem(1, year);
    parent = new TreeNode(nodeItem).setViewHolder(new YearHolder(_mainContext));
    root.addChild(parent);
   }
   if (!(newModuleName.equals(moduleName))) {
    moduleName = newModuleName;
    nodeModule = new ModuleHolder.IconTreeItem(1, moduleName);
    parentModule = new TreeNode(nodeModule).setViewHolder(new ModuleHolder(_mainContext));
    parent.addChild(parentModule);
   }
   NoteHolder.IconTreeItem nodeNote = new NoteHolder.IconTreeItem(1, final_note);
   child = new TreeNode(nodeNote).setViewHolder(new NoteHolder(_mainContext));
   parentModule.addChildren(child);

   /*String display = year + " | " + title + " | " + final_note;*/
  }
  AndroidTreeView tView = new AndroidTreeView(_notesActivity, root);
  _notesActivity.setContentView(tView.getView());
 } catch (JSONException e) {
  e.printStackTrace();
  Toast.makeText(_mainContext, "Error: " + e.getMessage(), Toast.LENGTH_LONG).show();
 }

} catch (JSONException e) {
 e.printStackTrace();
 Toast.makeText(_mainContext, "Error: " + e.getMessage(), Toast.LENGTH_LONG).show();
}

YearHolder类看起来像这样:

public class YearHolder extends TreeNode.BaseNodeViewHolder<YearHolder.IconTreeItem> {

    public YearHolder (Context context ) {
        super(context);
    }

    @Override
    public View createNodeView(TreeNode node, IconTreeItem value) {
        final LayoutInflater inflater = LayoutInflater.from(context);
        final View view = inflater.inflate(R.layout.custom_notes_view, null, false);
        TextView tvValue = (TextView) view.findViewById(R.id.text_title);
        tvValue.setText(value.text);

        return view;
    }

    public static class IconTreeItem {
        public int icon;
        public String text;

        IconTreeItem(int icon_, String text_) {
            this.icon = icon_;
            this.text = text_;
        }
    }
}

超级好用!