2013-12-08 2 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); 
} 

이 유지됩니다 빠른 scroller 모든 시간에.

+0

고마워요! 이것은 현재 좋은 해결 방법으로 작동합니다. – Tim

+0

이것은 나에게도 효과적이다. 나는 그것이 KitKat의 버그라고 생각합니다. 내 Jelly Bean 장치에서 올바르게 작동합니다. – chis54

+0

KitKat 장치에 대한 것 같습니다. 이것이 문제의 유일한 실제 솔루션입니다. 버전에 대한 동등성 검사를 고려해야합니다. 이후 버전에서 수정되었으므로 : https://code.google.com/p/android/issues/detail?id=63545 –

2

여기의 목록 스크롤이 유휴 상태가 아닌 경우

은 기본적으로 당신이 항상 표시 빠른 스크롤을 설정 대답 mikejonesguy 유사하다 약간 개선 된 해결 방법입니다. 목록에서 스크롤이 중지되면 타이머를 시작하고 일정 시간 후 빠른 스크롤을 해제합니다. 이것은 이전 버전의 안드로이드에서 작동하는 방식을 복제합니다.

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

그것은, 알려진 문제 (herehere보고)의 도움과는 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 –