Java 使用JSONObject创建有序数组

Java 使用JSONObject创建有序数组,java,android,arrays,json,Java,Android,Arrays,Json,让我解释一下我的问题。 (我是java新手,所以这类事情可能很简单,但我无法理解!) 我有一个JSONObject,它看起来像: { notes:[ { "scolaryear":2013, "codemodule":"B-CPE-042", "titlemodule":"B1 - Unix & C Lab Seminar", "codeinstance":"NCE-1-

让我解释一下我的问题。 (我是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();
}
第一个标题是年份,单击年份时,可以看到所有模块:

> MODULE #1
> MODULE #2 
...
当您单击一个模块时,您可以看到所有项目:

> PROJECT #1 | MARK : 20
> PROJECT #2 | MARK : 13 
...
最后,当你点击一个项目时,你可以看到评论

^ PROJECT #1 | MARK : 20 
   - Great project .. bla bla bla 
(如果可能,也可以显示包含注释的弹出窗口)

我知道这可能是一件复杂的事情,但我真的很想做到这一点


提前感谢您的帮助

我认为你有两种可能性:

  • 实现一个NoteJava对象,在表单期间初始化该对象并将其放入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"),...);
    }
    
    List notesList=new ArrayList();
    对于(int i=0;i
    现在用适当的方法对它进行排序,最后打印它,可能会覆盖toString()Note方法

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


  • 希望它能帮助你

    所以我找到了解决办法

    我使用了这个图书馆:

    这是我的密码:

    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();
    }
    
    试试看{
    //从阵列中提取项目
    TreeNode root=TreeNode.root();
    树状幼体;
    字符串year=“year”;
    字符串moduleName=“”;
    YearHolder.IconTreeItem nodeItem=新的YearHolder.IconTreeItem(1,年);
    ModuleHolder.IconTreeItem nodeModule=新的ModuleHolder.IconTreeItem(1,moduleName);
    TreeNode父节点=新的TreeNode(nodeItem).setViewHolder(new YearHolder(_mainContext));
    TreeNode parentModule=new TreeNode(nodeModule).setViewHolder(new ModuleHolder(_mainContext));
    JSONArray modArr=jsonObject.getJSONArray(“注释”);
    试一试{
    对于(int i=0;i
    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_;
            }
        }
    }
    
    public class YearHolder扩展TreeNode.basenodeviewwholder{
    公众年度持有人(背景){
    超级(上下文);
    }
    @凌驾
    公共视图createNodeView(TreeNode节点,IconTreeItem值){
    最终LayoutFlater充气机=LayoutFlater.from(上下文);
    最终视图=充气机。充气(R.layout.custom\u notes\u视图,null,false);
    TextView tvValue=(TextView)view.findViewById(R.id.text\u title);
    tvValue.setText(value.text);
    返回视图;
    }
    公共静态类IContreItem{
    公共int图标;
    公共字符串文本;
    IconTreeItem(整数图标、字符串文本){
    this.icon=icon;
    this.text=text_u2;;
    }
    }
    }
    

    超级容易使用!

    您需要根据需要实现和自定义它。您可以做的是从字符串中获取日期,并将其存储在注释对象格式中(选择您的格式,如yyyy MM dd)然后使用Comparator按日期对列表中的对象进行比较,默认情况下,它将按升序对日期进行排序。您希望在listview的列表项中显示什么?请在此处输入内容。是的,而不是使用字符串列表使用Notes对象列表,然后在Notes对象上从列表中实现Comparetor,它将对您的问题进行排序。
    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_;
            }
        }
    }