ListViewにはsetEmptyView
メソッドが生えていて、リストが空の時に「リストが空でっせ」という表示が簡単にできるようになっている。一方でRecyclerViewには特にそういったメソッドが生えている訳でもない。RecyclerViewにsetEmptyView
をする方法を調べてみると、Gistがちょいちょい見つかるのだけれど、RecyclerView側でDataObserver
を仕込んでいることが(やりたいことに対して)見合ってない気がしたこともあり、軽量に書けないか試してみた。
JitPack大好きなので導入はJitPack経由でどうぞ。
見た目
こんな感じで動く。 pic.twitter.com/igUcdAgPj7
— だぐりば (@D_R_1009) October 28, 2018
使い方
- EmptyRecyclerViewをRecyclerViewの代わりにxmlに記述
- EmptyRecyclerViewにsetEmptyViewでリストが空の時に表示するViewを追加(xmlでも、Java/Kotlinでも)
対応してみたので、RecyclerViewの高さがwrap_content
でも表示できる(はず)。横スクロールは対応を確認中。
実装
- EmptyViewをViewのフィールドインスタンスとして保持する
- EmptyRecyclerView#onMeasureにて、adapterが管理しているItemCountが0だった場合にEmptyViewのサイズを計算
- EmptyRecyclerView#onDrawにて、adapterが管理しているItemCountが0だった場合にEmptyViewを描画
attributeも書いたので、xmlでempty viewのレイアウトを記述しても動きます。動的にコード側でlayout resource idを追加しても、Viewそのものを追加してもいけます。
ひとこと
公式で実装されそうな気もしている。