2016-11-06 3 views
1

Ich entwickle eine Android-Anwendung, die eine erweiterbare Listenansicht für Daten vom Webdienst laden, aber ich möchte nicht ganze Daten beim Start laden, sondern zuerst Elternliste laden, dann klicken Sie auf die Elternliste erweitern bestimmte Listenelement von Kind der Listenansicht lade das untergeordnete Element eines bestimmten Elements, also ist es möglich oder nicht?Wie füge ich untergeordnete Artikel dynamisch onClick auf die erweiterbare Listenansicht der übergeordneten Artikel in Android hinzu?

Danke

+0

sicher: Welchen Adapter verwenden Sie? 'CursorTreeAdapter'? – pskink

+0

Nein, ich verwende BaseExpandableListAdapter. –

+0

mit BaseExpandableListAdapter benötigen Sie mehr Arbeit – pskink

Antwort

0

würde ich muss wissen, was die api aussieht. Was auch immer diese "Eltern" -Daten sind, könnte von etwas api kommen? Und könnten Sie diese "Kind" -Daten von einem anderen API-Anruf abrufen?

Eine Möglichkeit, es getan werden könnte, ist:

  1. eine api Anrufen -> getParentList(), die alle Elemente gefunden, die sich in Ihrer Eltern gehen.
  2. Bind diese Liste in Ihrem Adapter als Mutterwerte
  3. onClick von jedem Elternteil, ein anderes api machen, dass das untergeordnete Element dieses Elternteils liefert das heißt -> getChildOfParent (int parent_id), die Informationen des jeweiligen Elternteil zurückgibt.

Dinge zu beachten

Denken Sie daran, wenn sie auf die UI-Bindung sollten Sie irgendeine Art von Strategie haben. Wie groß ist diese Liste? Muss es paginiert werden? Wie gehst du mit dieser Paginierung um? Wie/wo werden Sie Ihre Artikelliste zwischenspeichern? Wie soll die User Experience aussehen?

Dies sind alles Dinge, plus viel mehr, darüber nachzudenken.

Einige Dinge, die Sie in diesem Fall prüfen sollten, sind Retrofit/okhttp, sqlite/realm, Picasso (falls Sie Bilder erweitern möchten), CursorAdapter (Paginierung).

1

Ich bin nicht ganz sicher, was Ihre Frage bedeutet, aber wenn Sie möchten, untergeordnete Elemente in einem BaseExpandableListAdapter dynamisch zu laden, z. lade die "untergeordneten Elemente", wenn du auf den entsprechenden Gruppenkopf klickst (wie unten), ich habe eine Lösung.

 
v Group header 1 
| -- Child item 1 
| -- Child item 2 
v Group header 2 
| -- Child item 1 
| -- Child item 2 

in Ihrer Tätigkeit, Ihre ExpandableListView wie diese finden:

ExpandableListView expandableListView = (ExpandableListView) findViewById(R.id.expandable_list_view); 

Dann wird ein Listener hinzufügen, für die Gruppe zu überprüfen, klickt:

expandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() 
{ 
    @Override 
    public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) 
    { 
     if (expandableListView.isGroupExpanded(groupPosition)) 
      expandableListView.collapseGroup(groupPosition); 
     else 
      new BackgroundTask(groupPosition).execute(); 

     return true; 
    } 
}); 

Die Rückkehr wahr wird "verbrauchen" der Klick und stoppen Sie die Standard-Erweiterung der Gruppe, wenn Sie darauf klicken. Deshalb müssen Sie sie in Ihrer ASyncTask manuell erweitern. Wenn Sie false zurückgeben, wird die Listenansicht automatisch in der GUI erweitert, und die Ergebnisse Ihrer Hintergrundberechnung werden erst angezeigt, wenn Sie die Gruppe reduzieren und erneut expandieren.

In meinem Code hatte ich ein SparseBooleanArray, um zu verfolgen, ob die Daten bereits für eine bestimmte Gruppe festgelegt wurden, und ich habe diesen Wert in der onGroupClick() -Methode überprüft; Ich tat dies, damit die Daten nur einmal geladen werden mussten, wenn eine Gruppe erweitert wurde, aber natürlich, wenn Sie möchten, dass sich die Daten bei jeder Erweiterung ändern, würden Sie das nicht wollen. Deine Frage war ziemlich vage, also bin ich mir nicht sicher, was genau dein Szenario für deine Verwendung ist.

private class BackgroundTask extends AsyncTask<Void, Void, List<ReturnType>> 
{ 
    int groupPosition; 

    private BackgroundTask(int groupPosition) 
    { 
     this.groupPosition = groupPosition; 
    } 

    @Override 
    protected List<ReturnType> doInBackground(String... params) 
    { 
     // TODO: Do your background computation... 
     // Then return it 
    } 

    @Override 
    protected void onPostExecute(List<ReturnType> resultsList) 
    { 
     super.onPostExecute(resultsList); 

     // TODO: Add the resultsList to whatever structure you're using to store the data in the ListView Adapter 
     expandableListView.expandGroup(groupPosition); 
    } 
} 

Ich bin mir nicht sicher, ob dies der beste Weg ist, um es zu tun, aber es hat sicherlich für mich funktioniert.

Verwandte Themen