EmptyView付きのRecyclerViewを書いた

ListViewにはsetEmptyViewメソッドが生えていて、リストが空の時に「リストが空でっせ」という表示が簡単にできるようになっている。一方でRecyclerViewには特にそういったメソッドが生えている訳でもない。RecyclerViewにsetEmptyViewをする方法を調べてみると、Gistがちょいちょい見つかるのだけれど、RecyclerView側でDataObserverを仕込んでいることが(やりたいことに対して)見合ってない気がしたこともあり、軽量に書けないか試してみた。

github.com

JitPack大好きなので導入はJitPack経由でどうぞ。

jitpack.io

見た目

使い方

  1. EmptyRecyclerViewをRecyclerViewの代わりにxmlに記述
  2. EmptyRecyclerViewにsetEmptyViewでリストが空の時に表示するViewを追加(xmlでも、Java/Kotlinでも)

対応してみたので、RecyclerViewの高さがwrap_contentでも表示できる(はず)。横スクロールは対応を確認中。

実装

  1. EmptyViewをViewのフィールドインスタンスとして保持する
  2. EmptyRecyclerView#onMeasureにて、adapterが管理しているItemCountが0だった場合にEmptyViewのサイズを計算
  3. EmptyRecyclerView#onDrawにて、adapterが管理しているItemCountが0だった場合にEmptyViewを描画

attributeも書いたので、xmlでempty viewのレイアウトを記述しても動きます。動的にコード側でlayout resource idを追加しても、Viewそのものを追加してもいけます。

ひとこと

公式で実装されそうな気もしている。