15

現在使用している ListView を変更して利用RecyclerViewできるようにしたいのですStaggeredGridLayoutManagerが、RecyclerView には ListView のようなヘッダーを追加する機能がありません。

通常、ListView を使用して、ヘッダーに空のビューを設定し、リストビューの下に画像を配置し、リストのスクロールで下部の画像を変換してParallax効果を作成します。

ヘッダーなしで、どうすれば同じ視差効果を作成できますRecyclerViewか?

4

4 に答える 4

26

だから今日、私はその効果をアーカイブしようとしましたRecyclerView. できましたが、コードが多すぎるので、ここに私の github プロジェクトを貼り付けて、プロジェクトの重要なポイントをいくつか説明します。

https://github.com/kanytu/android-parallax-recyclerview

まずgetItemViewTypeRecyclerView.Adapterクラスを確認する必要があります。このメソッドは、扱うビューのタイプを定義します。その型は に渡されonCreateViewHolder、そこでさまざまなビューを膨らませることができます。だから私がしたことは、位置が最初のものかどうかを確認することでした。そうであれば、ヘッダーを膨らませます。そうでない場合は、通常の行を膨らませます。

ビューをクリップするも追加したCustomRelativeLayoutので、仕切りや行がヘッダーの上に来ることに問題はありません。

この時点から、その背後にある残りのロジックを知っているようです。

最終結果は次のとおりです。

ここに画像の説明を入力

編集:

notifyItemChanged/Insertedアダプターに何かを挿入する必要がある場合は、メソッドに 1 を追加して正しい位置を通知してください。例えば:

public void addItem(String item, int position) {
    mData.add(position, item);
    notifyItemInserted(position + 1); //we have to add 1 to the notification position since we don't want to mess with the header
}

私が行ったもう 1 つの重要な編集は、スクロール ロジックです。私が使用していたmCurrentOffsetシステムは、アイテムを追加するとオフセットが変更されるため、アイテムの挿入では機能しませんでした。だから私がしたことは:

ViewHolder holder = findViewHolderForPosition(0);
if (holder != null)
  ((ParallaxRecyclerAdapter) getAdapter()).translateHeader(-holder.itemView.getTop() * 0.5f);

これをテストするために、postDelayedRunnable を追加し、アプリを起動して、最後までスクロールし、アイテムを位置 0 に追加して、もう一度上にスクロールしました。結果は次のとおりです。

ここに画像の説明を入力

誰かが他の視差効果を探しているなら、彼らは私の他のレポをチェックすることができます:

https://github.com/kanytu/android-parallax-listview

于 2014-10-27T19:18:06.813 に答える
1

kotlin の場合、以下のようにリサイクラー ビューを構成できます。

//setting parallax effects
    recyclerView.addOnScrollListener(object :RecyclerView.OnScrollListener(){
        override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
            super.onScrolled(recyclerView, dx, dy)
            val view = recyclerView?.getChildAt(0)
            if (view != null && recyclerView?.getChildAdapterPosition(view) === 0) {
                val imageView = view.findViewById(R.id.parallaxImage)
                imageView.translationY = -view.top / 2f
            }
        }
    })
于 2016-10-13T07:31:11.750 に答える