moxt

Just another Blog site

GridViewからRecyclerViewに移行したい

      2015/07/05

GridViewからRecyclerViewにクラス名変えるだけじゃ動かない。
移行過程をメモ。

dependencyにrecyclerviewを追加する

まずsupport libraryを導入する。

Adapterがaddできない

RecyclerViewではRecyclerView.AdapterクラスをAdapterとして受け入れるようになってる。
なので、既存のAdapterクラスだとダメ。

clearができない

ArrayListAdapterクラスとかではclearメソッドが用意されていたがRecyclerView.Adapterではclearが無い。
なので自分で実装する必要がある。

DataSourceに対する操作(add,addAll,clearなどなど。。)を誰が担うべきなのかよく分かってないので、上記の書き方が合ってるか謎ではある。

addAllができない

同上。

setSelectionが使えなくなった

スクロール位置を保存しておいて、リスト画面→詳細画面→リスト画面と詳細画面から戻ってきたときにスクロール位置を復元するために使ったりしてる。

で、このスクロール位置を指定する役割はLayoutManagerクラスが担うことになったみたい。
GridLayoutManagerやLinearLayoutManagerを見てみる。

  • scrollToPositionWithOffset(int position, int offset)
  • scrollToPosition(int position)

このあたりを使えばOK。

setEmptyViewが使えなくなった

TODO : 書く

getFirstVisiblePositionが使えなくなった

前述のLayoutManagerクラスが担ってる。

各Grid間のマージンが指定できない

GridViewではxmlでverticalSpacing=”8dp”とか指定すれば良かった。
RecyclerViewではマージン追加処理を載せたItemDecorationをAdapterにsetすることで実現できる。

An ItemDecoration allows the application to add a special drawing and layout offset to specific item views from the adapter’s data set. This can be useful for drawing dividers between items, highlights, visual grouping boundaries and more.

と、ドキュメントに書いてるようにonCreateViewHolderで生成したViewを土台にして、追加で何かを描画するとか、マージンを追加したいといった処理を担うのがItemDecorationクラス。

下記を読めばOK。
http://stackoverflow.com/a/28533234/2451025

上の記事ではviewのポジションに応じてマージンの有無を調節している。
viewのタイプに応じて処理を切り替える、なんてこともできる。

AWESOME_HEADER(int)タイプのviewだったら何もせず、それ以外のタイプのViewにはマージンを設定する。というものだ。

タイプが増えてくるとif文かswitch文だらけになるので、複雑度に応じて適宜Enumなどを使って処理を分岐させるなど、清潔な感じにしておくとよさ気。

Header追加したい

GridViewにはHeaderやFooterを追加する機能が無い。
なので、偉い人たちが作ってくれている。

https://github.com/liaohuqiu/android-GridViewWithHeaderAndFooterとかhttps://github.com/recruit-mp/android-HeaderFooterGridViewとかある。

一方、RecyclerViewではSpanSizeLookupクラスを使うことでHeaderやFooterらしいモノを作れるようになった。

これを見たら終わり。

例えば。。

こんな感じ。

これで3列のGridが使えるようになった。
Gridの要素は3分割された小さいViewでOKだが、Headerだけは横幅いっぱいのwidthが欲しい。

こういうときにSpanSizeLookup()を使う。

getSpanSizeメソッドで「あるポジションのViewは分割された要素何個分の大きさにすべきか?」を指定できる。
isHeaderメソッドは独自に実装したヤツなので、がんばって書く。

isHeaderがtrueであれば『layoutManager.getSpanCount() = 3』となる。Grid3個分のサイズだ。
falseであれば1なので、Grid1個分のサイズ。

これは便利。

 - Android

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

  関連記事

wallpaper.big-j.cs
Androidアプリで使う画像素材の圧縮をgulpで一括処理する

まず、デザイナーやらディレクターやらプロデューサーやらに『圧縮された画像をgitなどのバージョン管理システム上にコミットしてもらえる』そんな幸福な環境であれば無縁な話。 大概の組織では共有ファイルシステムに新しく追加する、もしくは変更された画像をドカッと置かれて「よろしく」って感じだろう。 …

wallpaper.big-j.cs
LeakCanaryの仕組みをある程度理解したいマン

Contents1 LeakCanaryとは何か2 …

no image
[WIP]AndroidでParseを使ってみる

今更感溢れてるが。 バックエンドな実装・運用は面倒くさい、Railsとか使い方分からない、的な人はParse良いかもしれない。 …

wallpaper.big-j.cs
Facebook製の画像ライブラリFrescoのコードを読んでいる

Facebookが新たに画像ライブラリFrescoを公開した。 DraweeView,DraweeController,DraweeHierarchyというクラスを利用したMVC的な構成を成しており、画像を効率よく読み込むようになっているらしい。(雑) …

logo_og
ReactNativeでGiphyのデータを表示する

まずは下記をサクッとパクってみる。 当方、比較的AndroiderなのでAndroidで。 …

no image
AndroidでGoogleTagManagerを使いたい

Contents1 GoogleTagManagerとは2 …

wallpaper.big-j.cs
手を動かしてViewDragHelperを学ぶ(無駄にKotlin)

まず、Youtubeの公式Androidアプリみたいなヤツ作りたくなった。 すでに有志がライブラリ作ってた。。 …

wallpaper.big-j.cs
Androidで超シンプルなWidgetを作りたい

情報が少なくてちょっとつまづいたのでメモ。 Contents1 …