0

ヘッダーと呼ばれる別のビューの上にオーバーレイされた ListView があります。このヘッダーは、さまざまな高さにすることができます。

ListView のデータセットで、空白の行を挿入し、プログラムでこの行の高さをヘッダー ビューの高さに設定します。このように、ListView が読み込まれると、位置 1 の行 (データの実際の最初の行) がヘッダーの下部に配置されます。これを行うのは、ヘッダー ビューを部分的に透明に設定できるようにするためです。ユーザーがスクロールすると、データの行がヘッダー ビューの透明度と混ざり合って表示されます。

これで、このリストに移動して特定の行を選択できるユース ケースが 1 つあります。私が行ったことは、位置 X で setSelection を呼び出すことです。これにより、ListView が自動的にスクロールされ、行 X の上部がリストの上部に表示されます。ただし、ヘッダー ビューではまだこれがわかりにくくなっています。これを補うために、scrollTo を呼び出します。これらの 2 つの部分は、次のようなものです。

listView.setSelection(selectedRowPosition);

if(hasHeadersEnabled()) { listView.scrollTo(-headerView.getMeasuredHeight). }

これらのコード行を呼び出すと、ListView は期待どおりに表示されます。選択した行の上部は、私の HeaderView の下部にあります。私が遭遇する問題は、ユーザーが ListView に触れるとすぐにスクロール位置がジャンプして、選択した行の上部が ListView の真の上部 (ヘッダー ビューの上部) になることです。

私の質問は、ListView で SelectedRow を設定した後、スクロールのために onTouch イベントを消費し始めたときに、ListView は常にその行の上部が ListView の上部になることを期待していますか? このコードでやりたいことを達成する別の方法はありますか? scrollTo と scrollBy を試しましたが、どちらも同じ効果があります。

4

1 に答える 1

1

したがって、API をもっと詳しく調べる必要がありました。私の質問に対する答えが見つかりました。

setSelection と scrollTo の組み合わせではなく、setSelectionFromTop を使用する必要があります。サンプルコードは次のとおりです。

listView.setSelectionFromTop(rowPosition, headerView.getMeasuredHeight());

于 2012-06-18T16:17:53.503 に答える