5.0アンドロイド - RecyclerViewにヘッダー/フッターを追加

? MathieuMaree @ | Original: StackOverFlow

私は失敗し、 RecyclerViewにヘッダを追加する方法を把握しようとした瞬間を過ごした。 これは私がこれまでに得たものです。

@Override
protected void onCreate(Bundle savedInstanceState)
{
    ...

    layouManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(layouManager);

    LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    headerPlaceHolder = inflater.inflate(R.layout.view_header_holder_medium, null, false);
    layouManager.addView(headerPlaceHolder, 0);

   ...
}

LayoutManagerはRecyclerView項目の処分を扱うオブジェクトであるように思われる。私は「 ____ 」の方法を見つけることができなかったとして、私はLayoutManagerの「 ____ 」メソッドで行くことにし、ヘッダのように作用する第一の位置に私のヘッダビューを追加することにしました。

物事は醜い取得する場所Aaandこれは、次のとおりです。

addHeaderView(View view)

これは正しい方法であれば、いくつかの取得した後、「 ____ 」 「 ____ 」活動創造の異なる瞬間に(もすべてが、でも、アダプタのデータを設定したらビューを追加しようとした)をコールしようとしている、私は見当がつかない実現それを行うには(それがあると見ていません) 。

誰かが私を助けてもらえますか?あるいは、少なくとも私に探索するいくつかのアイデア/新しい方向性を与えるか?

前もって感謝します!

VieuMa

PS :また、 LinearLayoutManagerに加えてGridLayoutManagerを扱うことができるソリューションは本当にいただければ幸いです!



Top 5 Respuesta

1Ian Newson @

私はこれを試していないが、あなたのアダプタでgetItemCountによって返された整数に(あなたは、ヘッダーとフッターの両方が必要な場合、または2 )私は単純に1を追加します。その後、 「 ____ 」ときに別の整数を返すために、アダプタの「 ____ 」上書きできます。 https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#getItemViewType(int)

「 ____ 」 、あなたはヘッダビューごとに異なる​​ビューホルダーを作成または構成することができ、あなたは「 ____ 」から返された整数を渡されます。 https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#createViewHolder(android.view.ViewGroup 、 INT)

に「 ____ 」渡された位置整数から1を減算することを忘れないでください。



2seb @

私は同じ問題を抱えていたし、アダプタをラップするために2つのアプローチを作成しました。一つは、かなり使いやすいですが、私はそれが変化するデータセットにどのように動作するかわからないんだけど。それはあなたのアダプタをラップすると、右のアダプタオブジェクトの「 ____ 」自分は確かのようなメソッドを呼び出すために作る必要があるため。

もう一つは、このような問題を持つべきではない。ちょうどあなたの定期的なアダプタは、クラスを拡張する抽象メソッドを実装してみましょう、あなたは準備が整っているはずです。そして、ここで彼らは、次のとおりです。

gists

https://gist.github.com/sebnapi/a2596ec3d1730ea47986 usage addView(View view, int position) https://gist.github.com/sebnapi/fde648c17616d9d3bcde usage java.lang.NullPointerException: Attempt to read from field 'android.support.v7.widget.RecyclerView$ViewHolder android.support.v7.widget.RecyclerView$LayoutParams.mViewHolder' on a null object reference at android.support.v7.widget.RecyclerView.getChildViewHolderInt(RecyclerView.java:2497) at android.support.v7.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:4807) at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:4803) at com.mathieumaree.showz.fragments.CategoryFragment.setRecyclerView(CategoryFragment.java:231) at com.mathieumaree.showz.fragments.CategoryFragment.access$200(CategoryFragment.java:47) at com.mathieumaree.showz.fragments.CategoryFragment$2.success(CategoryFragment.java:201) at com.mathieumaree.showz.fragments.CategoryFragment$2.success(CategoryFragment.java:196) at retrofit.CallbackRunnable$1.run(CallbackRunnable.java:41) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

HeaderRecyclerViewAdapterV1

NullPointerExceptions

HeaderRecyclerViewAdapterV2

addView(View view)

フィードバックとフォークは大歓迎。私は私の自己によって「 ____ 」を使用し、進化、テストおよび将来の変化を掲載します。

編集: @OvidiuLatcuはい、私はいくつかの問題を抱えていた。実際に私は「 ____ 」によって暗黙ヘッダーを相殺停止し、代わりにそれのために公共の方法「 ____ 」を作成しました。ので、あなたは設定した場合、「 ____ 」 Recyclerviewに、あなたが応じて子ビューを見つけ、 X 、タッチのy座標を取得し、タッチを傍受することができますし、「 ____ 」と呼んで、あなたは常に非オフセットさ位置を取得しますアダプター!これはRecyclerViewコードでshortcommingですが、私はこれを克服するための簡単な方法が表示されない。私は自分のコードをすることによってする必要があるときに、私は今、明示的な位置をオフセットのはこのためです。

3darnmason @

私は、他のアダプタをラップし、ヘッダーとフッタービューを追加するためのメソッドを提供するために自分のアダプタを実装することになった。

ここで要点を作成しました: https://gist.github.com/darnmason/7bbf8beae24fe7296c8a

私が望んでいた主な機能は、リストビューと同様のインターフェースだったので、私は「 ____ 」私のフラグメント中のビューを膨らませると「 ____ 」のに追加できるようにしたかった。これは「 ____ 」アダプタがラップされるように渡して、呼び出し「 ____ 」と「 ____ 」渡しあなたの水増しのビューを作成することによって行われます。その後、 「 ____ 」にアダプターとして「 ____ 」インスタンスを設定します。

余分な要件は、私は簡単にヘッダーとフッターを維持しながら、私はこれらのヘッダーとフッターの複数のインスタンスを持つ複数のアダプタを持っていたくなかったアダプターを交換できるようにするために必要なことでした。ですから、 「 ____ 」の変更が通知されると、完全なヘッダとフッタを残し包まれたアダプタを、変更するには、「 ____ 」呼び出すことができます。

4mato @

@のSEBのソリューションに基づいて、私は、ヘッダーとフッターの任意の数をサポートしていRecyclerView.Adapterのサブクラスを作成した。

https://gist.github.com/mheras/0908873267def75dc746

それが解決策になると思われるが、私はまた、このことはLayoutManagerにより管理されるべきだと思う。残念ながら、私は今それを必要と私はゼロからStaggeredGridLayoutManagerを実装(さえも、そこから延長)する時間がありません。

私はまだそれをテストしていますが、あなたがしたい場合、あなたはそれを試してみることができます。あなたはそれですべての問題を見つけた場合は私に知らせてください。