どのように複数のビュータイプとRecyclerViewを作成するには?

? GZ95 @ | Original: StackOverFlow

https://developer.android.com/preview/material/ui-widgets.htmlから、

私たちは「 ____ 」を作成した場合、我々はそのアダプターに結合することが「 ____ 」を指定する必要があります。

RecyclerView.Adapter

だから、それは、複数のビュータイプで「 ____ 」を作成することが可能ですか?



Top 5 Respuesta

1Anton Savin @

はい、それは可能です。ちょうど実装https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#getItemViewType(int) 、そして「 __ 」の「 ____ 」パラメータの世話をする。

だから、何かをのように実行します。

ViewHolder


2Harshit @

もう一つの解決策は、このviewholderにすべてのレイアウト入力のためのすべてのフィールドでViewHolder0をすることができます。アイテムの種類を持っているので、ホルダーの内側のif-else使用して、 (ビューのそれぞれの)すべてのこれらのフィールドのサブセットのみを取り込む。ちょうどビュータイプに類似したスイッチケースを書き、ちょうど関連フィールドを使用しています。ハックしかし、誰キャスティングと、ビューをデフォルトにフォールバックすることができますソートの。

3alto.you @

アントンのソリューション以下、保持しているこのViewHolder /レイアウトのハンドル/代表者別の種類を思い付く。 リサイクルビューのViewHolderは、データロールの形ではない場合でも、わからない置き換える新しいレイアウトが動作するかどう。

だから、基本的には、 新しいビューのレイアウトが必要な場合にonCreateViewHolder (のViewGroupの親、 int型たviewType )が唯一と呼ばれている。

getItemViewType ( int型の位置)たviewTypeのために呼び出されます。

ビューを(新しいデータがで持ってきて、そのViewHolderで表示しようとされている)リサイクル時onBindViewHolder ( ViewHolderホルダー、 int型の位置)が常に呼ばれます。

だからonBindViewHolderが呼び出されたときには、右のビューのレイアウトに入れViewHolderを更新する必要がある。

方法が持ち込まれるためにそのViewHolder 、またはすべての問題のためのビューのレイアウトを置き換えるに正しいですか? すべてのコメントに感謝!

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private String[] mDataset;

    public MyAdapter(String[] myDataset) {
        mDataset = myDataset;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView mTextView;
        public ViewHolder(TextView v) {
            super(v);
            mTextView = v;
        }
    }

    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.some_layout, parent, false);

        //findViewById...

        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.mTextView.setText(mDataset[position]);
    }

    @Override
    public int getItemCount() {
        return mDataset.length;
    }
}

編集: ViewHolderは、ビューを保持するために、メンバーmItemViewTypeを持って

編集: onBindViewHolder ( ViewHolderホルダー、 int型の位置)にViewHolderは、それが一致していることを確認するgetItemViewType ( int型の位置)を見によってピックアップ(または作成)されているに渡されたように見えますので、そこにそのViewHolderのを心配する必要はありませんタイプはデータ[位置]のタイプと一致していません。 誰もがonBindViewHolderでViewHolder ()がピックアップされる方法の詳細を知っていますか?

編集:リサイクルViewHolderがNO戦士そこタイプによって取り上げ、そのようにされているように見える。

編集: http://wiresareobsolete.com/2014/09/building-a-recyclerview-layoutmanager-part-1/はこの質問に答えます。

それはのようなリサイクルViewHolderを取得します。 ホルダー= getRecycledViewPool ( ) getRecycledView ( mAdapter.getItemViewType ( offsetPosition ) ) 。 または正しい型のリサイクルViewHolderが見つからない場合は、新しいものを作成。

RecyclerView