2013-12-08 5 views
18

Düzeninde, hızlı kaydırma özelliğini destekleyen bir ListView içeren bir uygulama yazdım (yani kaydırma çubuğu kaydırıcısını sürükleyerek listeyi hızlıca yukarı veya aşağı kaydırmanızı sağlar). Bu Jelly Bean (4.1-4.3) tüm sürümünde mükemmel çalıştı. Ancak, Kit Kat'a güncelledikten sonra, hızlı kaydırma artık çalışmıyor ve kaydırma çubuğum sadece normal bir kaydırma çubuğu. Ancak, uygulamamı kapatıp tekrar açarsam hızlı kaydırma görünür. Kit Kat'ta sürekli çalışmak için hızlı kaydırmayı nasıl alabilirim? Ben; kopyalanıp aşağıda benim liste görünümü adaptör kodu yapıştırılan ettik:Android'de Hızlı Kaydırma İle İlgili Sorunlar

// 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

Bu yüzden yıldız eklemek için çekinmeyin hakkında bir hata açtı. https://code.google.com/p/android/issues/detail?id=63545&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars –

+0

Benim için aynı sorun – JeffG

+0

Bu, Android v4'te çözülmüş görünüyor. 4.3. – mikejonesguy

cevap

13

burada aynı sorunu olması, bunun iyi bir çözüm değil, ama şimdilik bunu yapabilirsiniz:

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

Bu tutacak ana her zaman hızlı kaydırma.

+0

Teşekkürler! Bu, şu an için iyi bir geçici çözüm olarak çalışır. – Tim

+0

Bu benim için de çalıştı. KitKat'ta bir hata olduğundan şüpheleniyorum. Jelly Bean cihazlarında doğru çalışıyor. – chis54

+0

KitKat cihazları için görünüyor, bu problem için tek gerçek çözüm. Sürüm için bir eşitlik denetimi yapmayı düşünmelisiniz: daha sonraki sürümlerde düzeltildiği gibi: https://code.google.com/p/android/issues/detail?id=63545 –

2

İşte listesinde kaydırma boşta olmadığında

Temelde her zaman görünür hızlı kaydırma ayarlamak cevap mikejonesguy benzer biraz geliştirilmiş bir iş-dönünce. Liste ilerlemeyi durdurduğunda, bir zamanlayıcı başlatırsınız ve bir süre sonra hızlı kaydırma özelliğini kapatırsınız. Bu, eski Android sürümlerinde işe alışma şeklini kopyalar.

o

//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

Mikejonesguy'nin çözümü gibi, bu da gizler. Kullanılırken hızlı kaydırma (sadece biraz gecikme ile). Muhtemelen kodunuzda bir hata var mı? Ayrıca, hızlı kaydırma çubuğunun kullanılabilmesi için önce listeyi hareket ettirmeniz gerekir. –

1

Bu bilinen bir sorun (here ve here bildirilen) var yardımcı olur ve 4.4.3 itibariyle sabit var Umut.

İşte bir çözüm var:

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

Bu, yalnızca ilk kez çalıştığından (ListView'e başka bir bağdaştırıcı belirleyene kadar) gerçek bir çözüm değildir. Bununla birlikte, sorunun kökünde dokunmaya çalışır. –

+0

@ david.schreiber Biliyorum. Bunu nasıl tamamen çözeceğimi bilmiyorum. Bir yol bulursan, lütfen bana haber verir misin? belki 4.4.3'te düzelttiler? –

+0

Göründüğü kadarıyla: http://code.google.com/p/android/issues/detail?id=63545 –