2016-01-13 21 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_; 
     } 
    } 
} 

超級好用!