無限(エンドレス)スクロールの実装方法について

2,291 views
Skip to first unread message

hina

unread,
Nov 19, 2011, 9:45:08 AM11/19/11
to 日本Androidの会
初めて投稿します。
hinaと申します。

掲題の件について、
実装方法を模索しているのですが、よい方法が思いつかないため、
皆様のお知恵を拝借させていただければと思います。

やりたいことは、
ListView や ScrollViewを使って、リストの終端までスクロールしたときに、
リストの先頭のアイテムを再び表示してスクロールをエンドレスに行うようにしたいのです。

こちらで試した方法としては、
listView.setOnScrollListener の onScroll() でリストの終端に達したときに、
adapter.add(data) としてみましたが、
その場合Aというデータを更新した場合、追加したAは更新されません。

イメージ
+-------+
| A | あいう → かきく
+-------+
| B |
+-------+
| C |
+-------+
| A | ←add あいう
+-------+

そもそもやりたことが実現可能なものなのかすら分かっていませんので、
何か情報いただけると助かります。

上下スクロールだけでなく、左右スクロールでも同様のことをしたいです。

※キーワードとして、
「Endress」「Infinity」「Ring」 x 「List」「Scroll」
などで検索しましたが、私では情報見つけられませんでした。

Yoshihiro Oyama

unread,
Nov 19, 2011, 1:22:04 PM11/19/11
to android-g...@googlegroups.com
小山と申します。

問題のポイントはいくつかあります。
- (A)循環するビューのレイアウトと表示
- (B)タッチイベントでのスクロール操作
- (C)内容によるスクロール範囲の変化

ListViewやScrollViewは(B),(C)の部分がガチガチに記述されているので、
これらを拡張して解決するアプローチはあまりお勧めできません。

指で押さえたままなぞるスワイプ操作や指ではじいて飛ばすフリックの
最中にスクロール位置が循環するとおかしなことになると思います。

(A)はViewGroupを拡張して循環できるようにするだけなら特に難しくありません。
- scrollTo をオーバライドして適当なサイズで割って余りを使うように変更する
- onScrollChangedをオーバライドして子ビューの位置が期待と異なるなら
 offsetLeftAndRight や offsetTopAndBottom で位置をずらす
この2つが出来ればOKです。
もちろん onMeasure や onLayout の実装は必要になりますが、
割とテキトーで問題ありません。
試しに書いてみました。 http://www1.axfc.net/uploader/Sc/so/293801.zip 
適当に強制スクロールさせた状態。スクロール範囲の計算も適当です。

(B)はタップ操作とスワイプ、フリックを区別してから
子ビューにタッチイベントを渡すような仕組みを書くことになります。
Androidのソースを取得してView#dispatchTouchEvent あたりから
読んでみて、どう拡張するべきか検討するとよいでしょう。
フリック操作に対応させるつもりなら、それなりに作り込みが発生すると思います。

(C)はListView#onMeasure あたりから読んでみるとよいでしょう。
横方向もスクロールさせたいとのことですので、子ビューがどのような
MeasureSpec を受け取るべきなのかは考えてみて下さい。

おそらくあなたの期待した回答とは異なると思いますが、参考までに。

2011年11月19日23:45 hina <hinatak...@gmail.com>:

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。


hina

unread,
Nov 20, 2011, 8:14:41 AM11/20/11
to 日本Androidの会
小山さま

返信ありがとうございます。hinaです。

ポイントごとに問題の切り口挙げて頂いたので、
そこから紐解いていきたいと思います。

私のスキルでは時間かかると思いますが、
何かしらの成果出ましたら、こちらで報告させていただきたいと思います。

※一筋縄ではいきそうにないですが、頑張ります。

> 2011年11月19日23:45 hina <hinatakota3...@gmail.com>:

トムキャット

unread,
Nov 22, 2011, 9:09:19 AM11/22/11
to 日本Androidの会
トムキャットです。

ご希望のものとは違いますし、僕自身試したこともないのですが、こちらにヒントになりそうなリストに使えるコードがあります。

https://github.com/commonsguy/cwac-endless

リストの末端まで来ると次のをいくつかロードするというものです。

hina

unread,
Nov 23, 2011, 4:28:03 AM11/23/11
to 日本Androidの会
トムキャット様

hinaです。

情報ありがとうございます。
コード確認してみます。

Reply all
Reply to author
Forward
0 new messages