Android: GridViewに次へボタンを仕込む

GridViewで、twicca(Androidのtwitterアプリ)みたいに、リストビューの下のほうにスクロールしたら、『もっと読む』みたいなボタンをつけたいと思っていたのだけれど、GridViewにはListViewのようにヘッダーやフッターをつける方法がない。最初は無理やり、ScrollViewの中にLeniearLayout(GridViewとButton入り)を入れればできるかなと思っていたのだけれど、世の中甘くなかった。LeniearLayoutのlayout_widthをfill_parentにしても、そうなってくれないようなのである(EclipseのViewエディター上で確認)。元々GridView自体がScrollViewを内包しているためか、やっぱり思ったとおりにはなってくれないので、諦めかけていた。

twitterで諦めた宣言をしていたら、yokmamaさんからアドバイスをいただけたことで、閃いた。

ソースコードは今手元にないので、後日公開するとして(本当か?)、考え方はこうだ。
GridViewに渡すAdapterをImageAdapterとした場合、

  1. ImageAdapter.getCountの結果を1増やす。つまり、画像が20枚ならば、21にする。
  2. ImageAdapter.getViewで、
    positionが20未満の場合は今までと同じ処理(画像用)で画像を返す。
    20の場合は次へボタンを表す画像を返す
  3. GridView.setOnItemClickListenerで、positionが20未満の場合は今までと同じ処理。
    20の場合は次の20件をダウンロードしてImageAdapterを更新する処理を行う。

つまり、ダミーのGridViewアイテムを準備して、そいつがクリックされたらダウンロードという作戦。フッターを準備するのではなく、ImageAdapter側を変則的にすることで解決するという方法なので、ImageAdapterクラスの一貫性としては損なわれるのであるが、実装できなければ話にならない。それがプログラムという世界である、なんつって~…(ごめんなさい、実力がないだけです)。一列に画像が4枚あるとしたら、以下のようになります(■が画像、□がダウンロードボタンとする)。

■■■■
■■■■
■■■■
■■■■
■■■■

とりあえずはこれで次へボタンっぽい動きにはなった!しかし問題はまだあって、ListViewのようにInflatorを使っているわけではないので、追加されるというよりは、要素を増やしてGridViewを再描画するということになるため、処理が走るとスクロールバーが一番上に戻ってしまう。スクロールバーの位置を覚えておいて、ダウンロードボタンが押されてGridViewの再描画が行われたと同時に、スクロールバーの位置を変えてやらなければならないかなぁと思ってます。

本当にAndroidのレイアウトは奥が深いなぁ~と思い知らされる毎日。

(追記)
Android: GridView更新後にスクロール位置を保つを書きました。


カテゴリー Android, Java | タグ    | パーマリンク

コメント・トラックバック一覧

  1. 夜子まま says:

    そういうこと?
    それならそんなことしなくても

    <リニアレイアウト fil, fill>
    <GridView weight=1>
    <次へボタン Visible=gone width=file gravity=bottom>
    </リニアレイアウト>

    で必要に応じて次へボタンをVisible Gone ときりかえるとよいのでは?
    ボタンが非表示なると、画面がびょーんとしたまでのびるのでそれが嫌なら、Disableにして背景もすべて透明という手もある。

  2. >夜子ままさん
    コメントありがとうございます!

    上記では書いていないのですが、
    実は既に一番下にスライドショーボタンがあるのです(スライドショーアプリのため)。

    でもよく考えたら、GridViewのスクロールバーが下まで来たら、次へボタンをVisibleにすればいいかもしれませんね〜。その発想はありませんでした。

    今回のは自分の実装のが周囲にウケがよかったので、ひとまずはこのままいこうと思います。(iPhoneアプリのYouTubeが自分がやった実装方式と同じらしくて、いいんじゃないかという意見もありました)

  3. Pingback: Android: GridView更新後にスクロール位置を保つ | 自転車で通勤しましょ♪ブログ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です