2012-07-24 13 views
7

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

genannt
ArrayAdapter<String> adapter = new ScrollIndexListAdapter(Listing.this, elements); 
//Code for ScrollIndexListAdapter is below 

und die gleiche Listview aktualisiert wird.

enter image description here

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; 
    } 
} 
+0

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. –

Antwort

2

Es scheint, dass neueste Version Fastscroll dieses Problem nicht hat. Aber in Ihrem Fall gibt es eine Umkehrung. Wenn Sie den Adapter auf ListView setzen, deaktivieren und aktivieren Sie das schnelle Scrollen. Siehe den folgenden Code:

  adapter = new ScrollIndexListAdapter(this, data); 
      listView.setFastScrollEnabled(false); 
      listView.setAdapter(adapter); 
      listView.setFastScrollEnabled(true); 
+0

Ich finde diesen Fehler und für mich funktioniert das gut :) – JMR

Verwandte Themen