2010-10-10 13 views
15

Gibt es eine Möglichkeit, einen SectionIndexer erneut zu indizieren, nachdem neue Elemente zu einem ListView hinzugefügt wurden?Erneutes Indizieren/Aktualisieren eines AbschnittsIndexer

Ich fand diese solution, aber die Überlagerung ist Position in der oberen linken Ecke, nachdem der SectionIndexer aktualisiert wurde.

Wer hat irgendwelche Ideen?

+0

Nachladen ich etwas Similiar hier tue http://stackoverflow.com/questions/10224233/alphabetindexer-with-custom-adapter-managed-by-loadermanager – toobsco42

Antwort

4

Sobald die FastScroller (seine in AbsListView Klasse, die ListView reicht von) erhält Ihre Abschnitte durch SectionIndexer#getSections() Aufruf, es nie wieder erhält sie, wenn Sie aktivieren/deaktivieren schnell Scrollen im Link aufgeführt, wie Sie erwähnt. Um den Wert auf dem Bildschirm anzuzeigen, ruft FastScroller die Methode toString des Abschnitts auf.

Eine mögliche Lösung ist es, ein individuelles hat SectionIndexer, die folgenden Eigenschaften aufweisen:.

  • Sektionen Array ist mit einer festen Länge (maximaler Länge der erwarteten Anzahl von Abschnitten zum Beispiel, wenn die Abschnitte Englisch darstellen Alphabet es 26 sein wird)
  • Haben Sie eine benutzerdefinierte Objektabschnitte darstellen, anstatt Strings
  • Überschreiben schreiben~~POS=HEADCOMP Sie die toString Methode des benutzerdefinierten Abschnitt Objekt anzuzeigen, was Sie wollen auf der Grundlage der aktuellen ‚Abschnitt Werte‘.
  • -

z.B. In Ihrer benutzerdefinierten SectionIndexer

private int mLastPosition; 

public int getPositionForSection(int sectionIndex) { 
    if (sectionIndex < 0) sectionIndex = 0; 
    // myCurrentSectionLength is the number of sections you want to have after 
    // re-indexing the items in your ListView 
    // NOTE: myCurrentSectionLength must be less than getSections().length 
    if (sectionIndex >= myCurrentSectionLength) sectionIndex = myCurrentSectionLength - 1; 
    int position = 0; 
    // --- your logic to find the position goes in here 
    // --- e.g. see the AlphabeticIndexer source in Android repo for an example 

    mLastPosition = position; 
    return mLastPosition; 
} 

public Object[] getSections() { 
    // Assume you only have at most 3 section for this example 
    return new MySection[]{new MySection(), new MySection(), new MySection()}; 
} 

// inner class within your CustomSectionIndexer 
public class MySection { 
    MySection() {} 

    public String toString() { 
     // Get the value to displayed based on mLastPosition and the list item within that position 
     return "some value"; 
    } 
} 
1

fand ich, dass der beste Weg, dies zu tun ist setContentView(R.layout.whatever) zu rufen und dann wieder bevölkern die ListView mit Ihren neuen Adapter/neuen Datenelementen. Dadurch wird die ListView mit Ihren neuen Elementen neu gezeichnet und das FastScroll Overlay wird an der richtigen Stelle angezeigt.

0

I notifyDataSetInvalidated adaequat gefunden, hier ist die Idee:

public class MyAdapter extends XXXAdapter implements SectionIndexer { 
    ... 
    public void updateDataAndIndex(List data, Map index) { 
     // update sections 
     // update date set 
     notifyDataSetInvalidated(); 
    } 
} 

Aktualisierung Ihrer Daten gesetzt und Index (Abschnitte) irgendwie, und dann notifyDataSetInvalidated, aktualisieren der Index.

0

Sie zwingen können, Abschnitte Liste Listview von listView.setAdapter(yourAdapter)

Verwandte Themen