2016-01-13 20 views
-2

让我解释我的问题。 (!我是新来的Java,所以也许这种类型的东西可能很容易,但我无法弄清楚)使用JSONObject创建有序数组

我有一个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 
... 

最后,当你点击一个项目,你可以看到纪念nt!

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

(或者显示的包含注释的弹出窗口,如果有可能)

我知道这可能是配合物的事情,但我真的想做到这一点!

在此先感谢您的帮助!

+0

您需要实施https://code.google.com/p/tree-view-list-android/并根据您的需要对其进行自定义。 – kevz

+0

你可以做的是从字符串中获取日期,将它存储在注释格式的对象中(选择你的格式类似yyyy-MM-dd),然后使用比较器按日期对列表中的对象进行排序,它将按日期排序默认。 –

+0

你想在你的列表中显示什么?请在这里发表文章。 – Radhey

回答

1

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

  1. 实现一个注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进行排序。

希望它可以帮助你

+0

是相反,使用Notes对象的字符串使用列表列表,然后在Notes上执行Comparetor从列表Obect,它将排序您的问题。 –

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

超级好用!