Ich habe eine ListView
erstellt, die FastScroll
verwendet. (Siehe Bild) Wenn der Benutzer eine der folgenden Schaltfläche klickt (viz. Alle Track, Künstler, Album), jedes Mal der folgende benutzerdefinierte ArrayAdater wirdAndroid: FastScrolling SectionIndexer getSections() wird nur einmal aufgerufen
ArrayAdapter<String> adapter = new ScrollIndexListAdapter(Listing.this, elements);
//Code for ScrollIndexListAdapter is below
und die gleiche Listview aktualisiert wird.
PROBLEM: Nach meiner Untersuchung in Android, die getSections()
Methode wird nur einmal aufgerufen (das heißt nur, wenn die erste Zeit ScrollIndexListAdapter genannt wird).
Diesmal sind die Abschnitte besetzt & die FastScrolling funktioniert perfekt.
Aber wenn ich die ListView aktualisieren, indem ich auf Artists/Album klicke, wird die getSections()
Methode nicht aufgerufen. So werden die älteren Abschnitte verwendet, und der FastScrolling zeigt weiterhin Vorschauen von alten Alphabeten.
Also, wie kann ich Abschnitte immer aktualisiert werden, wenn der ListView aktualisiert wird?
Es gibt eine setSections()
Methode, aber ich bin nicht in der Lage zu finden, wie man es benutzt.
-Code für ScrollIndexListAdapter Klasse:
public class ScrollIndexListAdapter extends ArrayAdapter implements
SectionIndexer {
// Variables for SectionIndexer List Fast Scrolling
HashMap<String, Integer> alphaIndexer;
String[] sections;
private static ArrayList<String> list = new ArrayList<String>();
public ScrollIndexListAdapter(Context context, ArrayList<String> list) {
super(context, android.R.layout.simple_list_item_1, android.R.id.text1,
list);
this.list.clear();
this.list.addAll(list);
/*
* Setting SectionIndexer
*/
alphaIndexer = new HashMap<String, Integer>();
int size = list.size();
for (int x = 0; x < size; x++) {
String s = (String) list.get(x);
// Get the first character of the track
String ch = s.substring(0, 1);
// convert to uppercase otherwise lowercase a -z will be sorted
// after upper A-Z
ch = ch.toUpperCase();
if (!alphaIndexer.containsKey(ch)) {
alphaIndexer.put(ch, x);
}
}
Set<String> sectionLetters = alphaIndexer.keySet();
// create a list from the set to sort
ArrayList<String> sectionList = new ArrayList<String>(
sectionLetters);
Collections.sort(sectionList);
sections = new String[sectionList.size()];
sectionList.toArray(sections);
}
/*
* Methods for AphhabelIndexer for List Fast Scrolling
*/
@Override
public int getPositionForSection(int section) {
String letter = (String) sections[section];
return alphaIndexer.get(letter);
}
@Override
public int getSectionForPosition(int position) {
String letter = (String) sections[position];
return alphaIndexer.get(letter);
}
@Override
public Object[] getSections() {
return sections;
}
}
Meine Erfahrung auf Android ist begrenzt, aber ich würde argumentieren, dass Änderungen an der zugrunde liegenden Datenquelle durch den Aufruf von 'notifyDataSetChanged() 'im Adapter gesendet werden soll. –