2013-12-08 6 views
18

Я написал приложение, которое содержит ListView в своем макете, который поддерживает быструю прокрутку (т. Е. Перетаскивание ползунка полосы прокрутки позволяет быстро прокручивать вверх или вниз по списку). Это отлично работало во всей версии Jelly Bean (4.1-4.3). Однако после того, как я обновился до Kit Kat, ускоренная прокрутка больше не работает, а моя полоса прокрутки - обычная полоса прокрутки. Однако, если я отключу свое приложение и вернусь, появится быстрый прокрутка. Как быстро получить прокрутку для постоянной работы в Kit Kat? Я, Ве скопировать и вставить мой список вид адаптера код ниже:Проблемы с быстрой прокруткой в ​​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

Я открыл ошибку об этом, чтобы чувствовать себя свободно звезда его. https://code.google.com/p/android/issues/detail?id=63545&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars –

+0

Такая же проблема для меня – JeffG

+0

Это похоже на решение в Android v4. 4,3. – mikejonesguy

ответ

13

Имея тот же вопрос здесь, это не является хорошим решением, но теперь вы можете сделать:

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

Это будет держать ваш быстрый скроллер на все время.

+0

Спасибо! На данный момент это является хорошим решением. – Tim

+0

Это сработало и для меня. Я подозреваю, что это ошибка в KitKat. Он работает правильно в устройствах Jelly Bean. – chis54

+0

Кажется, что для устройств KitKat это единственное реальное решение проблемы. Вы должны рассмотреть возможность проверки равенства для версии: поскольку она исправлена ​​в более поздних версиях: https://code.google.com/p/android/issues/detail?id=63545 –

2

Вот несколько улучшилась работа вокруг которой похожа на mikejonesguy Ответят

В основном вы установили быстрые прокрутки всегда видны, когда в списке прокрутка не простаивает. Когда список перестает прокручиваться, вы запускаете таймер и быстро поворачиваете прокрутку через некоторое время. Это дублирует способ работы с более старыми версиями Android.

Надеется, что это помогает

//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, это скрывает быстрый скроллер, когда он используется (только с небольшой задержкой). Возможно, есть некоторая ошибка с вашим кодом? Также вам нужно сначала переместить список, прежде чем можно будет использовать быстрый скроллер. –

1

Это известная проблема (по сообщению here и here), и что он был зафиксирован по состоянию на 4.4.3.

Вот обходной путь:

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

Это не обходное решение, так как оно работает только в первый раз (вплоть до установки другого адаптера в ListView). Тем не менее, он пытается затронуть проблему в ее корне. –

+0

@ david.schreiber Я знаю. Я не знаю, как это решить. Если вы найдете способ, можете ли вы сообщить мне об этом? возможно, они зафиксировали его на 4.4.3? –

+0

Кажется, что у них есть: http://code.google.com/p/android/issues/detail?id=63545 –

Смежные вопросы