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.
sicher: Welchen Adapter verwenden Sie? 'CursorTreeAdapter'? – pskink
Nein, ich verwende BaseExpandableListAdapter. –
mit BaseExpandableListAdapter benötigen Sie mehr Arbeit – pskink