DEV

Android - RecyclerView

Gradleに追加する

compile 'com.android.support:recyclerview-v7:25.1.0'

RecyclerViewを設置する

<android.support.v7.widget.RecyclerView
android:id="@+id/rview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true" />

1行用xmlつくる

row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="20dp">
<TextView
android:id="@+id/item_name"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>

Adapterをつくる

RecyclerViewのアダプタは継承するやつが決まっているっぽい。RecyclerView.Adapterというのがある。下記3つの関数を実装する必要がある。

import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;
public class RecyclerAdatper extends RecyclerView.Adapter{
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return 0;
}
}

onCreateViewHolderは、ViewHolderのインスタンスをつくって返す。RecyclerView.ViewHolderを継承したViewHolderクラスである必要があって、インスタンス作成時に一行用viewを渡す。 onBindViewHolderは、holderとポジションがわたってくるので、それを使って該当ポジションデータをholderにセットする。 getItemCountは表示する数。表示可能なデータよりも多い数を指定するとエラーになる。

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.RViewHolder>{
private List<String> itemList;
public RecyclerAdapter(List<String> list) {
itemList = list;
}
public static class RViewHolder extends RecyclerView.ViewHolder {
public TextView nameView;
public RViewHolder(View v) {
super(v);
nameView = (TextView) itemView.findViewById(R.id.item_name);
}
}
@Override
public RViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ViewGroup view = (ViewGroup) LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent, false);
return new RViewHolder(view);
}
@Override
public void onBindViewHolder(RViewHolder holder, int position) {
holder.nameView.setText(itemList.get(position));
}
@Override
public int getItemCount() {
return itemList.size();
}
}

MainActivityをつくる

MainActivity.java

public class MainActivity extends AppCompatActivity {
private ArrayList<String> dataList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dataList = new ArrayList();
final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rview);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(new RecyclerAdapter(dataList));
createData();
}
private void createData() {
for (int i = 0; i < 30 ; i++ ) {
dataList.add("item" + i);
}
}
}

recyclerView.setHasFixedSize(true);は、リストのレイアウトサイズが固定の場合、setHasFixedSize()をtrueにするとパフォーマンスが向上するらしい。

参考: RecyclerView RecyclerView の基本的な使い方 [Android] RecyclerView:リストを表示する