2013-12-08 8 views
18

Ich schrieb eine App, die ein ListView in seinem Layout enthält, das schnelles Scrollen unterstützt (d. H. Das Ziehen des Scrollbalken-Schiebereglers ermöglicht das schnelle Scrollen in der Liste). Dies funktionierte perfekt in allen Versionen von Jelly Bean (4.1-4.3). Nachdem ich jedoch auf Kit Kat aktualisiert habe, funktioniert das schnelle Scrollen nicht mehr, und meine Bildlaufleiste ist nur eine normale Bildlaufleiste. Wenn ich jedoch aus meiner App aus und wieder zurück gehe, erscheint ein schneller Bildlauf. Wie kann ich schnell scrollen, um in Kit Kat konsequent zu arbeiten? Ich; ve kopiert und meine Listenansicht Adapter Code unten eingefügt:Probleme mit Fast Scroll in Android 4.4

// Adds section popup for fast scroll 
class NameListAdapter extends SimpleAdapter implements SectionIndexer { 
    HashMap<String, Integer> alphaIndexer; 
    private String[] sections; 
    private ArrayList<String> sectionList; 
    private List<HashMap<String, String>> data = null; 

    public NameListAdapter (Context context, List<HashMap<String, String>> data, 
      int resource, String[] from, int[] to) { 
     super(context, data, resource, from, to); 
     alphaIndexer = new HashMap<String, Integer>(); 
     sectionList = new ArrayList<String>(); 
     this.data = data; 
     int size = data.size(); 

     for (int i = 0; i < size; i++) { 
      HashMap<String, String> myData = (HashMap <String, String>) data.get(i); 
      // Get first character 
      String ch = myData.get("name").substring(0, 1); 
      // Convert character to upper case 
      ch = ch.toUpperCase(); 

      // Put first char/index into our HashMap 
      if (!alphaIndexer.containsKey(ch)) { 
       alphaIndexer.put(ch, i); 
       sectionList.add(ch); 
      } 
     } 
     sections = new String[sectionList.size()]; 
     sectionList.toArray(sections); 
    } 

    @Override 
    public int getPositionForSection(int section) { 
     if (section >= sections.length) { 
      return getCount() - 1; 
     } 

     return alphaIndexer.get(sections[section]); 
    } 

    @Override 
    public int getSectionForPosition(int pos) { 

     if (pos > data.size()) { 
      return 0; 
     } 

     HashMap<String, String> myData = (HashMap <String, String>) data.get(pos); 
     String ch = myData.get("name").substring(0, 1); 
     // Convert character to upper case 
     ch = ch.toUpperCase(); 

     for (int i = 0; i < sectionList.size(); i++) { 
      if (sectionList.get(i).equals(ch)) { 
       return i; 
      } 
     } 
     return 0; 

    } 

    @Override 
    public Object[] getSections() { 
     return sections; 
    } 
} 
+4

ich einen Fehler über geöffnet dies so fühlen sich frei, es zu spielen. https://code.google.com/p/android/issues/detail?id=63545&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars –

+0

Das gleiche Problem für mich – JeffG

+0

Dies scheint in Android v4 gelöst werden. 4.3. – mikejonesguy

Antwort

13

das gleiche Problem zu haben hier, es ist keine gute Lösung, aber jetzt können Sie tun:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
    view.setFastScrollAlwaysVisible(true); 
} 

Dies hält den schneller Scroller die ganze Zeit.

+0

Danke! Dies funktioniert jetzt als eine gute Abhilfe. – Tim

+0

Das hat auch für mich funktioniert. Ich vermute, dass es ein Fehler in KitKat ist. Es funktioniert einwandfrei in meinen Jelly Bean Geräten. – chis54

+0

Es scheint für KitKat Geräte, dies ist die einzige echte Lösung für das Problem. Sie sollten in Betracht ziehen, eine Gleichheitsprüfung für die Version durchzuführen: wie es in späteren Versionen behoben wird: https://code.google.com/p/android/issues/detail?id=63545 –

2

Hier ist eine leicht verbesserte Work-around, die ähnlich ist mikejonesguy beantworten

Grundsätzlich Sie Schnelldurchlauf immer sichtbar gesetzt, wenn die Liste blättern nicht untätig ist. Wenn die Liste den Bildlauf stoppt, starten Sie einen Timer und schalten den schnellen Bildlauf nach einer gewissen Zeit aus. Dies funktioniert wie bei älteren Versionen von Android.

Hoffe, dass es

//fix for kitkat bug in fast scroll 
Runnable delayedFastScrollFixRunnable = new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     if (listView != null && fastScrollAlwaysVisible) 
     { 
      listView.setFastScrollAlwaysVisible(false); 
      fastScrollAlwaysVisible = false; 
     } 
    } 
}; 
Handler delayedFastScrollFixHandler = new Handler(); 
boolean fastScrollAlwaysVisible = false; 

mList.setOnScrollListener(new OnScrollListener() { 

    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) 
    { 
     //fix an issue with 4.4 not showing fast scroll 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) 
    { 
     if (scrollState == SCROLL_STATE_IDLE) 
     { 
      if (fastScrollAlwaysVisible) 
      { 
       delayedFastScrollFixHandler.postDelayed(delayedFastScrollFixRunnable, 750); 
      } 
     } 
     else 
     { 
      if (!fastScrollAlwaysVisible) 
      { 
       delayedFastScrollFixHandler.removeCallbacks(delayedFastScrollFixRunnable); 
       listView.setFastScrollAlwaysVisible(true); 
       fastScrollAlwaysVisible = true; 
      } 
     } 
    } 
    } 

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

Wie mikejonesguy's Lösung verbirgt diese die schneller Scroller während der Benutzung (nur mit etwas Verzögerung). Wahrscheinlich gibt es einen Fehler mit Ihrem Code? Außerdem müssen Sie zuerst die Liste verschieben, bevor der Schnellwechsler verwendet werden kann. –

1

hilft Es ist ein bekanntes Problem (berichtet here und here), und dass es ab 4.4.3 festgelegt wurde.

Hier ist eine Abhilfe:

public static void setFastScrolledEnabled(final AdapterView<?> adapterView,final boolean enable) 
    { 
    final GridView gridView; 
    final ListView listView; 
    if(adapterView instanceof GridView) 
     { 
     gridView=(GridView)adapterView; 
     listView=null; 
     } 
    else if(adapterView instanceof ListView) 
     { 
     listView=(ListView)adapterView; 
     gridView=null; 
     } 
    else throw new UnsupportedOperationException("setFastScrolledEnabled is only available for gridView/listView"); 
    if(Build.VERSION.SDK_INT==VERSION_CODES.KITKAT) 
     adapterView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() 
     { 
      @TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
      @Override 
      public void onGlobalLayout() 
      { 
      if(gridView!=null) 
       gridView.setFastScrollEnabled(enable); 
      else if(listView!=null) 
       listView.setFastScrollEnabled(enable); 
      adapterView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      } 
     }); 
    else if(gridView!=null) 
     gridView.setFastScrollEnabled(enable); 
    else if(listView!=null) 
     listView.setFastScrollEnabled(enable); 
    } 
+0

Dies ist keine echte Problemumgehung, da es nur zum ersten Mal funktioniert (bis Sie einen anderen Adapter auf die ListView setzen). Nichtsdestoweniger versucht es das Problem an der Wurzel zu berühren. –

+0

@ david.schreiber Ich weiß. Ich habe keine Ahnung, wie ich das komplett lösen soll. Wenn Sie einen Weg finden, können Sie mich bitte wissen lassen? vielleicht haben sie es auf 4.4.3 behoben? –

+0

Es scheint, als ob sie haben: http://code.google.com/p/android/issues/detail?id=63545 –