web-dev-qa-db-ja.com

android:recyclerviewのエントリ

以下のようなエントリ属性でlistviewを使用しました:

<ListView
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:entries="@array/fi"/>

今私はそれをRecyclerViewに変換しています

<Android.support.v7.widget.RecyclerView
    Android:id="@+id/rv"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" />

RecyclerViewAndroid:entries属性があるかどうか知りたいですか?または、エントリの代わりに他の属性はありますか?

37
Ravi

他の回答で正しく説明されているように、xmlからRecyclerViewを埋めるための属性はありません。ただし、 Android Databinding を使用すると、同様の属性を非常に簡単に作成できます。

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto">
    <Android.support.v7.widget.RecyclerView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        app:entries="@{@stringArray/fi}"
        app:layoutManager="Android.support.v7.widget.LinearLayoutManager"/>
</layout>

ここにバインディングアダプタの定義があります。

import Android.databinding.BindingAdapter;

public class RecyclerViewBindings {

    @BindingAdapter("entries")
    public static void entries(RecyclerView recyclerView, String[] array) {
        recyclerView.setAdapter(new SimpleArrayAdapter(array));
    }

    static class SimpleArrayAdapter extends RecyclerView.Adapter<SimpleHolder> {

        private final String[] mArray;

        public SimpleArrayAdapter(String[] array) {
            mArray = array;
        }

        @Override
        public SimpleHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            final LayoutInflater inflater = LayoutInflater.from(parent.getContext());
            final View view = inflater.inflate(Android.R.layout.simple_list_item_1, parent, false);
            return new SimpleHolder(view);
        }

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

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

    static class SimpleHolder extends RecyclerView.ViewHolder {

        private final TextView mTextView;

        public SimpleHolder(View itemView) {
            super(itemView);
            mTextView = (TextView) itemView.findViewById(Android.R.id.text1);
        }
    }
}

次に、DataBindingUtilメソッドを使用してレイアウトを膨らませる必要があります。

アクティビティ内で膨らませる:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    DataBindingUtil.setContentView(this, R.layout.content_main);
}

フラグメント内で膨らませます:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    ContentMainBinding bindings = DataBindingUtil.inflate(inflater, R.layout.content_main, container, false);
    return bindings.getRoot();
}
38
rciovati

これはそのままでは不可能です。RecyclerViewを拡張して、文字列配列を受け入れる独自のカスタム属性を定義してから、RecyclerViewアダプタにこれらの値を入力します。

このリンクを確認してください: http://developer.Android.com/training/custom-views/create-view.html#customattr

5
Mina Samy

いいえ。 RecyclerViewにはそのような直接利用可能な属性はありません。LayoutManagerを使用してプログラムでJavaコードからRecyclerView.Adapterこの回答を参照

理由:ご存知のように、RecyclerViewを設定するまで、LayoutManagerは膨張しません。また、LayoutManagerの個々のアイテムビューを膨らませるには、RecyclerViewが必要です。これらの個々のアイテムビューは、RecyclerView.Adapterから取得されます。したがって、LayoutManagerRecyclerView.Adapterの両方をRecyclerViewに設定するまで、RecyclerViewを使用することはできません。

この回答がお役に立てば幸いです。

5
Amrut Bidri