この質問は非常に具体的です。私がやろうとしていること (リスト ビューで) は、次の記事で詳しく説明されています: http://www.pushing-pixels.org/2011/07/18/android-tips- and-tricks-synchronized-scrolling.html
リンクをありがとう@kaushal trivedi
詳細: カスタム アダプターを使用してリスト ビューを使用する Android アプリケーションを開発中です。リストビューには、固定されていない高さのカスタム ヘッダーが含まれています。また、リスト項目の高さも可変であることに注意してください。私の目標は、最新の gmail アプリ (例として) で生成される効果を模倣することです。メールを表示しているときにヘッダーをスクロールすると、アクション バーのすぐ下の画面の上部に固定され、コンテンツが引き続き表示されます。その下にスクロールします。私がやりたいことは、ヘッダーの下半分を画面の上部に貼り付けることです。
私の最初の理由は、目的の場所に固定された非表示のビューを作成し、ユーザーがその場所までスクロールしたとき、またはその場所を過ぎたときにビューを表示することでした。このロジックの問題は、正確なピクセル スクロールの高さが必要であることです。私が遭遇した正確な問題は、onScroll イベントでピクセル レベルの Y スクロールを取得するために収集できるものからは不可能であり、onScrollStateChanged イベントで値を取得することしかできませんでした。上記のように、これは目的の機能を達成しません。
onScroll イベントの "int firstVisibleItem, int visibleItemCount, int totalItemCount" パラメーターを操作することもオプションではありません。これは、「固定」したいコンテンツがリスト アイテムのサイズではなく、そのサイズの一部であるためです。可変高ヘッダー。
この効果を達成する正しい方法はありますか? 現在の minSDK レベルは 10 です。
2013 年 10 月 10 日更新
私はいくつかの進歩を遂げました。次のコードは、画面上の Y 位置のフローティング ビューをリスト ビューと同期します。b は、例として設定しているビューです。
注: これはonScroll
、リスト ビューのイベントで使用されます。
View c = view.getChildAt(0);
if (c != null) {
int currY = c.getTop();
int diffY = currY - lastY;
lastY = currY;
b.setTop(b.getTop() + diffY);
}
問題は、前に述べたように、リストのヘッダーの高さが固定されていないことです。したがって、ヘッダーの高さを取得し、「b」にオフセットを適用して、リストの上に浮かぶリスト ヘッダーの下部に配置する必要があります。
これは私がこれまでに試したコードです。
header.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
ここでの問題header.getMeasuredHeight();
は、実際の高さがどれほど高くても、常に同じ値に解決されます。
表示されるまで高さを取得できないことを理解しています。その値を取得し、レンダリング後にオフセットを設定する方法はありますか?
2013 年 10 月 11 日更新
今朝起きてすぐに最後の質問に答えました。
View.measure()
コードが高さを返している間。テキストがないと仮定すると、ビューのデフォルトの高さのように見えます (最終的にビューが引き伸ばされます)。そのため、以下のイベントを使用して、ビューが表示されたときにリッスンし、実際の高さを記録しました (これは、私が望んでいたとおりに機能します:))
ViewTreeObserver vto = header.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
b.setY(header.getMeasuredHeight() - 80); //80 is a temp offset
}
});
私はすぐに仕事に行かなければならず、まだ望ましい効果を完全に達成していないので、まだ回答済みとしてマークしません. うまくいけば、私は座って、翌日か二日でこれを終えることができるでしょう. これを行うためのより良い方法について、私はまだ提案を受け付けています。