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

## <i class="fa fa-cubes" style="font-size:1em;"> RecyclerView is 何?

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

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

例
<img width="317" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/182857/f8e9796a-5c11-3e5c-907a-971ba370b73c.png">


##  <i class="fa fa-cubes" style="font-size:1em;"> どうやって使う?

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



##  <i class="fa fa-cubes" style="font-size:1em;"> 作ってみよう

### 構成

* 今回は最低限の構成で作る
	* 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();
    }

}


```

##  <i class="fa fa-cubes" style="font-size:1em;"> 説明

* [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で表示するアイテムの数を返している。
 
 
##  <i class="fa fa-cubes" style="font-size:1em;"> 感想
 
* 処理の流れは追えたのですが、正直、LayoutManagerが裏でどういう仕事をしてるのか、ViewHolderが何をしているのか、まだいまいち掴めていないなぁという所感です。