FC2ブログ
  • 館内放送 [ツイッター]

    キンコンカンコーン・・・うみゃーだよ。館内放送だみゃ。
    ・・・・・キンコンカンコーン・・・ブツ
  • 町内会からのお知らせ [相互RSS]

【技術部】 [Android] AbstractなRecyclerView.Adapterの実装例


※カテゴリー【技術部】は技術者向けの記事となります。


今回の主旨

似たような RecyclerView.Adapter をいくつも作っていると・・・
マスにゃー

Abstract な RecyclerView.Adapter クラスがほしくなりませんか?

今回は、Abstract な RecyclerView.Adapter クラスの作成方法を紹介します。





サンプルコード 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しています。



まとめ


アプリの規模が大きくなるにつれて、抽象クラスが必要なケースが増えてくるかと思います。

アプリ開発の参考になれば幸いです。



関連記事
この記事へのリアクション

コメントの投稿

非公開コメント

大変参考になりました。
ありがとうございました。



タグ:技術部 Android 開発 RecyclerView abstract

プロフィール

うみゃー・アパカ

Author:うみゃー・アパカ
UMYA.net公式ブログです。
ツイッター:umya_net


リンクフリーです!
アドレス:http://umyanet.blog.fc2.com/

公式ホームページ

ラインスタンプ配信中!

リンク



スマホアプリ配信中

黄金疾走

スポンサード

人気商品

Powered by amaprop.net