1

最近、カスタム スクロールの作業を開始しRecyclerViewましたが、問題が発生しました。ヘッダーのパララックスを行ったところ、うまく機能しましたが、スクロールすると行が拡張されるようにしたかったのです。この方法recyclerView.computeVerticalScrollOffset()では、リストの最初の 2 つの項目に対しては正常に機能する必要がありましたが、その後はバラバラになります。

これが私のコードの例です:

FrameLayout main = (FrameLayout) holder.itemView;
if (main != null) {
    int height = calculateHeight(offset, (position + i));
    RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) main.getLayoutParams();
    lp.height = height;
    main.setLayoutParams(lp);
}

そのため、レイアウト内の位置とリサイクルビューのオフセットに基づいて高さを計算する関数があります。2 番目のアイテムがY == 0オフセットに達すると、半分に低下します (つまり、1200 から 600 に低下し、その後も継続しますが、計算はすべて間違っています)。

安定したオフセット値を取得する方法、または recyclerView の位置と一致するものに変更する方法に関するアイデア。

編集:

OK、問題を順を追って説明できます。

  • アダプターの位置 (0) の要素の高さは 1200 です
  • 他のすべての要素のデフォルトの高さは 300 です
  • ユーザーが下にスクロールし始めると、position(1) の要素が高さ 300 から 1200 に拡大し始めます

--------- ここからコードが壊れ始めます... -----------

  • 新しい高さ 1200 の position(1) の要素が画面の上部に到達したとき ( のときgetTop() == 0)、ここでのオフセットは約 900 です。
  • この同じ要素が画面から外れ始める (ユーザーが下にスクロールしている) と、トップ画面とこの要素が衝突するポイント (0,0) のオフセットが半分になるため、オフセットは 900 になるはずのときに 450 になり、それから 450 以降になりますが、position(1) にある私の要素は、本来あるべきサイズの半分しかありません...
4

1 に答える 1

2

OKこのソリューションの回避策を作成しました。将来誰かが必要になった場合に備えて、これを回答として投稿しています。

独自のオフセットを計算します。

public int offsetForVerticalScrolling(RecyclerView recyclerView) {
    LinearLayoutManager llm = (LinearLayoutManager) recyclerView.getLayoutManager();

    int position = llm.findFirstVisibleItemPosition();
    ViewHolder mViewHolder = (ViewHolder) recyclerView.findViewHolderForAdapterPosition(position);
    View item = mViewHolder.itemView;

    int y = (int) item.getY();
    if (y < 0) y *= -1;

    if (position == 0) return y;
    else {
        int offset = y;
        for (int i = 0; i < position; i++) {
            //Add your previous item heights to offset
        }
        return offset;
    }
}
于 2015-12-19T00:41:36.883 に答える