2013-12-08 17 views
18

速いスクロールをサポートしているリストビューを含むアプリを書いています(つまり、スクロールバーのスライダをドラッグすると、リストを素早く上下にスクロールできます)。これは、すべてのバージョンのJelly Bean(4.1-4.3)で完全に機能しました。しかし、私が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のバグだと思っています。それは私のゼリービーンのデバイスで正しく動作します。 – 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 –

関連する問題