4

この質問は非常に具体的です。私がやろうとしていること (リスト ビューで) は、次の記事で詳しく説明されています: 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
     }      
});

私はすぐに仕事に行かなければならず、まだ望ましい効果を完全に達成していないので、まだ回答済みとしてマークしません. うまくいけば、私は座って、翌日か二日でこれを終えることができるでしょう. これを行うためのより良い方法について、私はまだ提案を受け付けています。

4

1 に答える 1

2

さて、多くの時間と調査の後、私は自分の質問に対する答えを見つけました。

まず、@kaushal にこのリンクをありがとう: http://www.pushing-pixels.org/2011/07/18/android-tips-and-tricks-synchronized-scrolling.html

私の解決策はやや複雑になりました。ここで説明する代わりに、サンプルアプリを作成してここに投稿しました: https://github.com/gh123man/Partial-Header-ListView-Scroll-Sync

ソリューションのコードを含む特定のファイルは次のとおりです: https://github.com/gh123man/Partial-Header-ListView-Scroll-Sync/blob/master/src/com/example/partialheaderlistviewscrollsync/MainActivity.java

于 2013-10-14T19:14:50.797 に答える