GridViewで、twicca(Androidのtwitterアプリ)みたいに、リストビューの下のほうにスクロールしたら、『もっと読む』みたいなボタンをつけたいと思っていたのだけれど、GridViewにはListViewのようにヘッダーやフッターをつける方法がない。最初は無理やり、ScrollViewの中にLeniearLayout(GridViewとButton入り)を入れればできるかなと思っていたのだけれど、世の中甘くなかった。LeniearLayoutのlayout_widthをfill_parentにしても、そうなってくれないようなのである(EclipseのViewエディター上で確認)。元々GridView自体がScrollViewを内包しているためか、やっぱり思ったとおりにはなってくれないので、諦めかけていた。
twitterで諦めた宣言をしていたら、yokmamaさんからアドバイスをいただけたことで、閃いた。
ソースコードは今手元にないので、後日公開するとして(本当か?)、考え方はこうだ。
GridViewに渡すAdapterをImageAdapterとした場合、
- ImageAdapter.getCountの結果を1増やす。つまり、画像が20枚ならば、21にする。
- ImageAdapter.getViewで、
positionが20未満の場合は今までと同じ処理(画像用)で画像を返す。
20の場合は次へボタンを表す画像を返す - GridView.setOnItemClickListenerで、positionが20未満の場合は今までと同じ処理。
20の場合は次の20件をダウンロードしてImageAdapterを更新する処理を行う。
つまり、ダミーのGridViewアイテムを準備して、そいつがクリックされたらダウンロードという作戦。フッターを準備するのではなく、ImageAdapter側を変則的にすることで解決するという方法なので、ImageAdapterクラスの一貫性としては損なわれるのであるが、実装できなければ話にならない。それがプログラムという世界である、なんつって~…(ごめんなさい、実力がないだけです)。一列に画像が4枚あるとしたら、以下のようになります(■が画像、□がダウンロードボタンとする)。
■■■■
■■■■
■■■■
■■■■
■■■■
□
とりあえずはこれで次へボタンっぽい動きにはなった!しかし問題はまだあって、ListViewのようにInflatorを使っているわけではないので、追加されるというよりは、要素を増やしてGridViewを再描画するということになるため、処理が走るとスクロールバーが一番上に戻ってしまう。スクロールバーの位置を覚えておいて、ダウンロードボタンが押されてGridViewの再描画が行われたと同時に、スクロールバーの位置を変えてやらなければならないかなぁと思ってます。
本当にAndroidのレイアウトは奥が深いなぁ~と思い知らされる毎日。
(追記)
Android: GridView更新後にスクロール位置を保つを書きました。
そういうこと?
それならそんなことしなくても
<リニアレイアウト fil, fill>
<GridView weight=1>
<次へボタン Visible=gone width=file gravity=bottom>
</リニアレイアウト>
で必要に応じて次へボタンをVisible Gone ときりかえるとよいのでは?
ボタンが非表示なると、画面がびょーんとしたまでのびるのでそれが嫌なら、Disableにして背景もすべて透明という手もある。
>夜子ままさん
コメントありがとうございます!
上記では書いていないのですが、
実は既に一番下にスライドショーボタンがあるのです(スライドショーアプリのため)。
でもよく考えたら、GridViewのスクロールバーが下まで来たら、次へボタンをVisibleにすればいいかもしれませんね〜。その発想はありませんでした。
今回のは自分の実装のが周囲にウケがよかったので、ひとまずはこのままいこうと思います。(iPhoneアプリのYouTubeが自分がやった実装方式と同じらしくて、いいんじゃないかという意見もありました)
Pingback: Android: GridView更新後にスクロール位置を保つ | 自転車で通勤しましょ♪ブログ