2016-08-05 53 views
0

Ich erschaffe Objekte von json mit jackson und ich möchte diese Objekte in einem expandableListView zeigen.Wie ordne ich diese Liste von Objekten einer erweiterbaren Listenansicht zu?

Die json sieht wie folgt aus:

[ 
    { 
    "name": "Pete", 
    "profile_img": "img001", 
    "relations": { 
     "is_working_with": [], 
     "is_in_course_with": [ 
     { 
      "profile_img": "img002", 
      "name": "Jack" 
     } 
     ], 
     "is_friends_with": [ 
     { 
      "profile_img": "img003", 
      "name": "Stacey" 
     }, 
     { 
      "profile_img": "img002", 
      "name": "Jack" 
     } 
     ] 
    } 
    }, 
    { 
    "name": "Jack", 
    "profile_img": "img002", 
    "relations": { 
     "is_working_with": [{ 
     "profile_img": "img003", 
     "name": "Stacey" 
     }], 
     "is_in_course_with": [ 
     { 
      "profile_img": "img001", 
      "name": "Pete" 
     } 
     ], 
     "is_friends_with": [ 
     { 
      "profile_img": "img003", 
      "name": "Stacey" 
     }, 
     { 
      "profile_img": "img001", 
      "name": "Pete" 
     } 
     ] 
    } 
    } 
] 

Und meine Java-Klassen sind:

public class Student { 
    @JsonProperty("name") 
    String name; 
    @JsonProperty("profile_img") 
    String profileImg; 
    @JsonProperty("relations") 
    Relations relations; 

    //Constructors 
    //Setter, Getter 
} 
public class Relations { 
    @JsonProperty("is_working_with") 
    List<IsWorkingWith> isWorkingWith; 
    @JsonProperty("is_friends_with") 
    List<IsFriendsWith> isFriendsWith; 
    @JsonProperty("is_in_course_with") 
    List<IsInCourseWith> isInCourseWith; 

    //Constructors 
    //Setter, Getter 
} 
public class IsWorkingWith { 
    @JsonProperty("name") 
    String name; 
    @JsonProperty("profile_img") 
    String profileImg; 
} 
public class IsFriendsWith { 
    @JsonProperty("name") 
    String name; 
    @JsonProperty("profile_img") 
    String profileImg; 
} 
public class IsInCourseWith { 
    @JsonProperty("name") 
    String name; 
    @JsonProperty("profile_img") 
    String profileImg; 
} 

ich versuchte BaseExpandableListAdapter zu erweitern und ich habe es für die Gruppenansichten arbeiten, aber, wie ich tun Geben Sie an, welches Attribut meines Objekts Student die untergeordneten Elemente in der Listenansicht darstellt.

Grundsätzlich möchte ich es wie folgt aussehen:

list mockup

Wie soll ich die Elemente in der untergeordneten Ansicht generieren?

Antwort

0

Angesichts der Art, wie Sie Ihre ExpandableListView veranschaulicht haben, sind die Kinder die Mitglieder der Relations-Klasse. Sie haben eine zusätzliche Dimension, da jedes Mitglied in der Klasse Beziehungen eine eigene Liste hat.

Lassen Sie uns zunächst Ihre Klassendefinitionen beheben:

public class Relations { 
    @JsonProperty("is_working_with") 
    List<Person> isWorkingWith; 
    @JsonProperty("is_friends_with") 
    List<Person> isFriendsWith; 
    @JsonProperty("is_in_course_with") 
    List<Person> isInCourseWith; 
} 

public class Person { 
    @JsonProperty("name") 
    String name; 
    @JsonProperty("profile_img") 
    String profileImg; 
} 

Wenn jeder Beziehung seine eigenen Eigenschaften hat, dh Person in-Gang-mit einer Eigenschaft für den Kurs hat sie gemeinsam nutzen, hoffentlich Ihre JSON Anmerkungen können mit umgehen eine separate Personenunterklasse

Also nur zum Beispiel die getChildrenCount()

@Override 
    public int getChildrenCount(int groupPosition) { 
     return 3; // because every student has three types of relations 
    } 

Nun kommen Sie zu den komplexeren Teil nehmen lassen. Sie haben ein einzelnes Kind, das selbst eine Liste hat. Die Kindansicht muss also mit einer unterschiedlichen Anzahl von Personen umgehen. Es gibt verschiedene Möglichkeiten dafür, aber wenn ich wählen müsste, würde ich das Kind eine horizontale RecyclerView anzeigen lassen.

@Override 
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View view, ViewGroup parent) { 

     // first let's handle the model stuff 
     Student student = (Student) getGroup(groupPosition); // would need to be implemented 
     List<Person> persons; 
     switch (childPosition) { 
     case 0: 
      persons = student.isWorkingWith; 
      break; 
     case 1: 
      persons = student.isFriendsWith; 
      break; 
     case 2: 
      persons = student.isInCourseWith; 
      break; 
     } 

     // now set up the view/adapter 
     RecyclerView recyclerView; 
     PersonAdapter adapter; // you would need to write this 
     if (view == null) { 
      view = LayoutInflater.from(mContext).inflate(R.layout.child, parent, false); 
      recyclerView = (RecyclerView) view.findViewById(R.id.recyclerview); 
      view.setTag("recyclerview", recyclerView); 
      adapter = new PersonAdapter(parent.getContext()); // no data yet 
      view.setTag("adapter", adapter); 
      recyclerView.setLayoutManager(new LinearLayoutManager(parent.getContext(), LinearLayoutManager.HORIZONTAL, false); 
      recyclerView.setAdapter(adapter); 
     } else { 
      recyclerView = (RecyclerView) view.getTag("recyclerview"); 
      adapter = (PersonAdapter) view.getTag("adapter"); 
     } 

     adapter.setData(persons); // this method needs to call notifyDataSetChanged() 

     return view; 
    } 

Sie enden also mit geschachtelten Adapter-basierten Ansichten.

Anstelle von RecyclerView können Sie Ihre Personenansichten dynamisch hinzufügen/entfernen (nicht empfohlen), oder Sie können eine horizontale LinearLayout mit etwa ein Dutzend Personenansichten aufblähen und dann die Ansichten ausblenden, die Sie nicht verwenden. Aber der RecyclerView Ansatz ist ein wenig einfacher.

Wie auch immer, hoffentlich ist das genug, um Sie zu beginnen.