サンプルコード 1/3:Abstract な RecyclerView.Adapter クラス
 | 今回のメインとなります、Abstract な RecyclerView.Adapter クラスの実装例です。 |
| |
AbstractAdapter.java
// AbstractListAdapterクラス。
// VHには、RecyclerView.ViewHolderクラスを継承したクラスを指定できる。
// IMには、Objectクラスを継承したクラスを指定できる。
public abstract class AbstractAdapter<VH extends RecyclerView.ViewHolder, IM extends Object> extends RecyclerView.Adapter<VH> {
protected List<IM> mList;
protected Listener listener;
// クリックと、長押しのリスナーのインターフェース
public interface Listener {
void onItemClick(int position);
boolean onItemLongClick(int position);
}
// クリックと、長押しのリスナーをセットするメソッド
public void setClickListener(Listener listener) {
this.listener = listener;
}
@Override
public VH onCreateViewHolder(ViewGroup viewGroup, int i) {
throw new IllegalStateException();
}
@Override
public int getItemCount() {
return mList.size();
}
// リストを空にする。
public void clear() {
int size = this.mList.size();
this.mList.clear();
this.notifyItemRangeRemoved(0, size);
}
// リストを追加する。
public void addAll(ArrayList<ITEM> itemList) {
this.mList.addAll(itemList);
notifyDataSetChanged();
}
// リストからアイテムを追加する。
public IM get(int potion) {
return this.mList.get(potion);
}
}
 | ポイントは、4行目にある、< VH extends RecyclerView.ViewHolder, IM extends Object > です。 |
| |
 | この抽象クラスを使用する際に VHと、IMを指定することを意味しています。 |
| |
 | VHは、RecyclerView.ViewHolderを継承したクラス。IMは、Objectクラスを継承したクラスを指定する必要があります。 |
| |
サンプルコード 2/3:AbstractAdapterクラスを継承したクラス
 | AbstractAdapter クラスを継承したクラスの実装例です。 |
| |
ItemListAdapter.java
// AbstractListAdapterクラスを継承する。
// VHには、ItemListAdapter.ViewHolderクラスを使用する。
// IMには、Itemクラスを使用する。
public class ItemListAdapter extends AbstractListAdapter<ItemListAdapter.ViewHolder,Item> {
public ItemListAdapter(Context context, List<Item> list) {
mList = list;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_row, viewGroup, false);
return new ViewHolder(view,this.listener);
}
public void onBindViewHolder(ItemListAdapter.ViewHolder holder, int position) {
Item item = (Item) mList.get(position);
holder.mTitle.setText(item.getTitle());
}
static class ViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener,View.OnLongClickListener {
@BindView(R.id.item_title) TextView mTitle;
private Listener listener;
public ViewHolder(View view, Listener listener) {
super(view);
this.listener = listener;
ButterKnife.bind(this, view);
view.setOnClickListener(this);
view.setOnLongClickListener(this);
}
@Override
public void onClick(View view) {
if(this.listener != null) {
this.listener.onItemClick(getAdapterPosition());
}
}
@Override
public boolean onLongClick(View v) {
if(this.listener != null) {
this.listener.onItemLongClick(getAdapterPosition());
}
return false;
}
}
}
 | ポイントは、4行目です。 |
| |
 | サンプルでは、VHとして、ItemListAdapter.ViewHolderクラス。IMとして、Itemクラスを指定しています。 |
| |
※ ItemListAdapter.ViewHolderクラスは、RecyclerView.ViewHolderを継承しています。
※ Itemクラスは、Objectクラスを継承しています。
サンプルコード 3/3:ItemListAdapterクラスを使用する
 | ItemListAdapterクラスを使用した例です。 |
| |
ItemListFragment.java
public class ItemListFragment extends Fragment {
private AbstractListAdapter adapter;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// ItemListAdapterをセットする。
adapter= new ItemListAdapter(getActivity(), new ArrayList<Item>());
// リスナーをセットする。
adapter.setClickListener(listener);
}
// アダプターにアイテムリスト追加する。
private void AddItem(ArrayList<Item> list) {
adapter.addAll(list);
}
// アダプターからアイテムを取得する。
private Item getItem(int position) {
return adapter.get(position);
}
// リスナーを定義する。
private ItemListAdapter.Listener listener = new ItemListAdapter.Listener() {
// クリック時の処理。
@Override
public void onItemClick(int position) {
Item item = this.getItem(position);
}
// 長押し時の処理。
@Override
public boolean onItemLongClick(int position) {
Item item = this.getItem(position);
return true;
}
};
}
 | ポイントは、3行目と10行目です。 |
| |
 | AbstractListAdapterとして宣言したadapter変数に、ItemListAdapterクラスをnewしています。 |
| |
まとめ
 | アプリの規模が大きくなるにつれて、抽象クラスが必要なケースが増えてくるかと思います。 |
| |
 | アプリ開発の参考になれば幸いです。 |
| |