2015/06/14

RecyclerViewでRealmResultを扱う

Realmはクエリ結果となるRealmResultをListViewで表示するためのアダプタとしてRealmBaseAdapterを用意している.
ListViewを使用する場合は問題ないがRecyclerViewではこれを使用できない.

RealmResultをRecyclerViewで使用するためのアダプタのベースを書いた.
RealmRecyclerViewAdapter.java

import android.content.Context;
import android.support.v7.widget.RecyclerView;

import io.realm.RealmObject;
import io.realm.RealmResults;

public abstract class RealmRecyclerViewAdapter<T extends RealmObject, VH extends RecyclerView.ViewHolder>
    extends RecyclerView.Adapter<VH> {

  protected RealmResults<T> realmResults;
  protected Context context;

  public RealmRecyclerViewAdapter(Context context, RealmResults<T> realmResults) {
    if (context == null) {
      throw new IllegalArgumentException("Context cannot be null");
    }
    if (realmResults == null) {
      throw new IllegalArgumentException("RealmResults cannot be null");
    }

    this.realmResults = realmResults;
    this.context = context;
  }

  @Override
  public int getItemCount() {
    return realmResults.size();
  }
}

RecyclerView.Adapterを実装する際は上記アダプタを継承し, オリジナルのアダプタを作成する.

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import io.realm.RealmResults;

public class ModuleAdapter extends RealmRecyclerViewAdapter<Module, ModuleAdapter.ViewHolder> {

  static class ViewHolder extends RecyclerView.ViewHolder {
    private TextView value, id;

    public ViewHolder(View v) {
      super(v);
      value = (TextView) v.findViewById(android.R.id.text1);
      id = (TextView) v.findViewById(android.R.id.text2);
    }
  }

  public ModuleAdapter(Context context, RealmResults<Module> realmResults) {
    super(context, realmResults);
  }

  @Override
  public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(context)
        .inflate(android.R.layout.simple_list_item_2, parent, false);
    return new ViewHolder(v);
  }

  @Override
  public void onBindViewHolder(ViewHolder view, int position) {
    Module module = realmResults.get(position);
    view.id.setText(module.getId());
    view.value.setText("value:" + module.getValue());
  }
}

以上.