RecyclerView is 何?
-
Viewを動的に繰り返して表示するwidget
-
Support Library(com.android.support:recyclerview-v7)の中に含まれる
どうやって使う?
- 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も使うのでそれも記述)
dependencies {
...
compile 'com.android.support:recyclerview-v7:23.3.0'
compile 'com.android.support:cardview-v7:23.3.0'
...
}
(2) RecyclerView全体のレイアウトを定義
<?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行毎のレイアウトを定義
<?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で記述
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の紐付けを行う
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が何をしているのか、まだいまいち掴めていないなぁという所感です。