edo1z blog

プログラミングなどに関するブログです

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:リストを表示する