2011-10-24 6 views
19

選択可能なヘッダービューを持たないListViewで高速スクロールを有効にしました。リストを下にスクロールし、ファーストスクロールサムを上にドラッグすると、リストは最初の要素にのみスクロールし、ヘッダービューにはスクロールしません。リストをドラッグすると、期待どおりに動作します。FastScrollerはヘッダービューではなく最初の要素にスクロールします。

スクリーンショット1:スクリーンショットの赤い領域はヘッダービューです。
Screenshot2:サムを上にドラッグすると、最初の要素だけになり、ヘッダービューはまだ上になります。

ListView lv = (ListView) findViewById(R.id.listView); 
lv.addHeaderView(getLayoutInflater().inflate(R.layout.view,null), null, false); 

 

<ListView 
    android:layout_height="fill_parent" 
    android:id="@+id/listView" 
    android:layout_width="fill_parent" 
    android:fastScrollEnabled="true" 
></ListView> 

私はデモプロジェクト作成しました: https://github.com/mikegr/fastscroll-bug

はなぜトップに戻ってスクロールしないつまみをドラッグありませんか?

Red area is a header view dragging thumb does not go back to top

+0

この問題を解決する方法を見つけたことがありますか? – clauziere

答えて

12

これはFastScrollerの意図的な動作です。 ListViewsetAdapterを呼び出すと、ヘッダーが設定されている場合、アダプタはHeaderViewListAdapterにラップされます。このため、addHeaderViewの前にsetAdapterに電話する必要があります。その後、FastScrollerコードでは、我々は、次を参照してください。

ある
if (adapter instanceof HeaderViewListAdapter) { 
     mListOffset = ((HeaderViewListAdapter)adapter).getHeadersCount(); 
     adapter = ((HeaderViewListAdapter)adapter).getWrappedAdapter(); 
    } 

は、オフセット取得し、根本的なアダプタを使用します。 mListOffsetを使用して、高速スクロールでスクロールするための先頭位置を設定します。では、実際にこのラッピングはどこで行われますか?だから我々は間違いなく正しい場所を中心に探している

if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) { 
     mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter); 
    } else { 
     mAdapter = adapter; 
    } 

:我々が見るListView.addHeaderView、予想通り、まで。今、あなたの目標はあなたの速い親指のためのリストヘッダーのオフセット動作を持たないことですが、そうでなければヘッダーを持つ通常のリストを持つように思えます。これを行うには、(コードの内容に基づいて)FastScroller.mListOffset = 0で十分です。これはgetSectionsFromIndexerでのみ設定され、initでは無条件と、mListAdapter == nullでは条件付きでのみいくつかの他の関数で設定されます。 onSectionsChangedが呼び出された場合ははnullになりますので、ここでそのパスを無視しましょう。

多くの掘り出し物や様々な反射フックで遊んだ後で、私はこれを行う方法がないと言えるでしょうが、それは少しでも将来の互換性があります。リフレクションを使用して、HeaderViewListAdapterをヘッダーカウントなどに置き換えることができます。しかし、それはかなり壊れやすいです。同様に、(パッケージが可視の)FastScrollerを独自の振る舞いでサブクラス化することもできます。 mListOffsetはゲッターではなく広く参照されるため、これは通常よりも醜いです。基本的には、あなたが望むようにシステムがうまく動作しないという事実に反して走っています。

コードからは意図的な動作であることが分かりましたので、私はこれをバグと呼んでいます。ヘッダーのメカニズムを使用するのではなく、リストの最初の要素を特別な最初の要素にすることを検討しましたか(おそらく、のようなカスタムWrapperListAdapterを使用しています)。

+0

新しい "mListOffset"は "mHeaderCount"と呼ばれるようになりました。私は両方の値を0に設定していますが、すべてがうまくいくようです。将来のすべてのリリースがその問題を壊す可能性は間違いありません。 –

関連する問題