2010-12-16 8 views
18

Mam klasę, która implementuje expandable list activity.
W kodzie XML (lub mogę to zrobić w języku Java) ustawiłem fastScrollEnabled na true. Dzięki temu można szybko przewinąć. ALE szybkie przewijanie działa tylko w górnej części listy. Tak jak mogę użyć paska przewijania szybkiego przewijania, aby przewinąć całą listę, ale działa tylko w górnej części paska przewijania. To nie jest proporcjonalne do całej listy. Mogę przeciągnąć pasek kciuka do dolnej części listy, ale nie przewija się, ponieważ listview jest już przewinięty do dołu z powodu dziwnego zachowania, które działa tylko w górnej części listy.
Mylenie wiem, mogę spróbować wyjaśnić bardziej jeśli potrzebne ....Android fastScroll obejmuje tylko część listy

zrobić realizować niestandardowe BaseExpandableListAdapter.

+0

Czy wiersze na liście mają różne rozmiary? –

+6

Czy możesz ... proszę ... wstawić swój kod XML – Rockin

+5

Prześlij swój kod/xml –

Odpowiedz

1

Jest to błąd w szybkim zmieniacza. Nie działa dobrze z ExpandableListView.

Zobacz my code.

(zawiera również obejście niektórych przypadkach)

+0

Pobrałem twój FastScroller.java, ale nie wiem, jak to zaimplementować. Czy możesz wskazać mi, jak wprowadzić to w moją aplikację ExpandableListView? Dziękuję bardzo za kod. – Dante

5

Właśnie znalazł obejście, aby zapobiec system wyświetlania tego złego zachowania.

Istnieją dwa scenariusze, które używają innego kodu, aby zadziałał SectionIndexer.

Pierwszy scenariusz polega na użyciu FastScrollbar-Thumb w celu przejścia do następnej sekcji. Zakładając, że grupy są twoi Sekcje nadpisane metody realizacji SectionIndexer będzie wyglądać tak:

@Override 
public int getPositionForSection(int section) { 
    return section; 
} 

// Gets called when scrolling the list manually 
@Override 
public int getSectionForPosition(int position) { 
    return ExpandableListView.getPackedPositionGroup(
       expandableListView 
        .getExpandableListPosition(position)); 
} 

Drugi scenariusz jest tak, że podczas przewijania listy ręcznie i szybkie przewijania poruszać według sekcji, nie wszystkie przedmioty. Kod wygląda więc tak:

@Override 
public int getPositionForSection(int section) { 
    return expandableListView.getFlatListPosition(
       ExpandableListView.getPackedPositionForGroup(section)); 
} 

// Gets called when scrolling the list manually 
@Override 
public int getSectionForPosition(int position) { 
    return ExpandableListView.getPackedPositionGroup(
       expandableListView 
        .getExpandableListPosition(position)); 
} 

Jak widać, te dwa zachowania nie mogą grać razem bez dalszej adopcji.

Obejście problemu polegające na tym, że oba działają, polega na przechwyceniu sprawy, gdy ktoś przewija jedną rękę (to jest przewijanie za pomocą dotyku). Można to zrobić przy wdrażaniu interfejs OnScrollListener z klasy adaptera i ustawić ją na ExpandableListView:

public class MyExpandableListAdapter extends BaseExpandableListAdapter 
       implements SectionIndexer, AbsListView.OnScrollListener { 

    // Your fields here 
    // ... 
    private final ExpandableListView expandableListView; 
    private boolean manualScroll; 

    public MyExpandableListAdapter(ExpandableListView expandableListView 
            /* Your other arguments */) { 
     this.expandableListView = expandableListView; 
     this.expandableListView.setOnScrollListener(this); 
     // Other initializations 
    } 

    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
     this.manualScroll = scrollState == SCROLL_STATE_TOUCH_SCROLL; 
    } 

    @Override 
    public void onScroll(AbsListView view, 
         int firstVisibleItem, 
         int visibleItemCount, 
         int totalItemCount) {} 

    @Override 
    public int getPositionForSection(int section) { 
     if (manualScroll) { 
      return section; 
     } else {    
      return expandableListView.getFlatListPosition(
         ExpandableListView.getPackedPositionForGroup(section)); 
     } 
    } 

    // Gets called when scrolling the list manually 
    @Override 
    public int getSectionForPosition(int position) { 
     return ExpandableListView.getPackedPositionGroup(
        expandableListView 
         .getExpandableListPosition(position)); 
    } 

    // Your other methods 
    // ... 
} 

To Naprawiono błąd dla mnie.

+0

Wow, naprawiliśmy błąd, który mieliśmy przez 3 lata. Dzięki! –

+0

@ mitch000001, umieściłem twój kod w mojej aplikacji ExpandableListView, ale dało mi to błąd zamknięcia NullPointerException po każdym rozszerzeniu dowolnej grupy. Czy potrzebuję SectionIndexer.java, aby to działało? Dziękuję Ci – Dante

Powiązane problemy