LoginSignup
34
28

More than 5 years have passed since last update.

今更だけど、RecyclerViewの基本をまとめてみた

Posted at

RecyclerView is 何?

  • Viewを動的に繰り返して表示するwidget

  • Support Library(com.android.support:recyclerview-v7)の中に含まれる


1.png

どうやって使う?

  • RecyclerViewを利用するには最低限、AdapterとViewHolderを作る必要がある
  • RecyclerViewのレイアウト管理はLayoutManagerを利用する

作ってみよう

構成

  • 今回は最低限の構成で作る
    • RecyclerViewActivity.java ・・・ RecyclerViewを表示する
    • RecyclerViewAdapter.java ・・・ Viewとデータの紐付けを行う
    • activity_recycler_view.xml ・・・ RecyclerView全体のレイアウト
    • row.xml ・・・ RecyclerView内の1行のレイアウト

手順

(1) build.gradleにSupport Libraryの依存関係を記述

(今回はCardViewも使うのでそれも記述)

build.gradle
dependencies {
    ...
    compile 'com.android.support:recyclerview-v7:23.3.0'
    compile 'com.android.support:cardview-v7:23.3.0'

    ...
}

(2) RecyclerView全体のレイアウトを定義

activity_recycler_view.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

(3) 1行毎のレイアウトを定義

row.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="64dp"
    android:layout_margin="8dp"
    android:orientation="vertical">

    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="8dp" />
</android.support.v7.widget.CardView>

(4) RecyclerViewの初期化処理をActivityで記述

RecyclerViewActivity.java

public class RecyclerViewActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private RecyclerViewAdapter recyclerViewAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycler_view);
        recyclerView = (RecyclerView) findViewById(R.id.recycler_view);

         // [1] 
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);

         // [2] 
        recyclerViewAdapter = new RecyclerViewAdapter(getListData());
        recyclerView.setAdapter(recyclerViewAdapter);
    }

    private List<String> getListData() {
        ArrayList<String> list = new ArrayList<>();
        list.add("睦月");
        list.add("如月");
        list.add("弥生");
        list.add("卯月");
        list.add("皐月");
        list.add("水無月");
        list.add("文月");
        list.add("葉月");
        list.add("長月");
        list.add("神無月");
        list.add("霜月");
        list.add("師走");
        return list;
    }

}

(5) Adapterクラスを作成して、データとViewの紐付けを行う

RecyclerViewAdapter.java

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

    protected List<String> dataSet;

    // [3]
    public static class ViewHolder extends RecyclerView.ViewHolder {
        public final TextView textView;

        public ViewHolder(View v) {
            super(v);
            textView = (TextView) v.findViewById(R.id.text_view);
        }
    }

    // [4]
    public RecyclerViewAdapter(List<String> myDataSet) {
        dataSet = myDataSet;
    }

    // [5]
    @Override
    public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent, false);
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    // [6]
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        String text = dataSet.get(position);
        holder.textView.setText(text);
    }

    // [7]
    @Override
    public int getItemCount() {
        return dataSet.size();
    }

}


説明

  • [1]
    LinearLayoutManagerのインスタンスを生成し、RecyclerViewのsetLayoutManager()メソッドの引数として渡している。LinearLayoutManagerの他にもGridLayoutManagerなどの種類がある。表示したいレイアウトによって変更する。

  • [2]
    Adapterを生成し、viewにセットしている。今回はAdapterを生成するタイミングでデータも渡している。

  • [3]
    RecyclerView.ViewHolderを継承したクラス。Viewへの参照を保持している。[5]のonCreateViewHolder()メソッドで、ViewHolderのインスタンスを返している。

  • [4]
    今回はAdapterが生成されたタイミングでデータも渡している。

  • [5]
    Viewのinflate(膨らむ)、ViewHolderを作成し、返している。

  • [6]
    ViewHolderに対してデータをセットしている。

  • [7]
    RecyclerViewで表示するアイテムの数を返している。

感想

  • 処理の流れは追えたのですが、正直、LayoutManagerが裏でどういう仕事をしてるのか、ViewHolderが何をしているのか、まだいまいち掴めていないなぁという所感です。
34
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
28