[千葉支部]実装の質問ってこのメーリングリストでしていいの?

1,181 views
Skip to first unread message

shimo

unread,
Jun 6, 2011, 8:49:51 AM6/6/11
to android-grou...@googlegroups.com
日本Androidの会@千葉支部 メンバーの皆さん

こんにちは

第2回勉強会に参加させていただいて(PCは持って行きませんでしたが)
自分でも何かツールを作成しようと始めました。

ListViewの実装でわからない箇所が出てきたのですが、このメーリングリストで
質問しても良いでしょうか?

--
o1234...@hotmail.com

しもてぃ

山口 優

unread,
Jun 6, 2011, 8:53:47 AM6/6/11
to android-grou...@googlegroups.com
shimoさん

千葉支部@山口です。
実装の質問に関して千葉支部のメーリングリストへ投稿されるのは
基本的に問題ないと考えております。

ちなみにListViewでどのあたりが不明でしょうか?

uky...@gmail.com

unread,
Jun 6, 2011, 9:13:24 AM6/6/11
to android-grou...@googlegroups.com
真鍋です。

個人的には千葉支部のメーリングリストではAndroidに関することはwelcomだと思って
います。アプリの使い方でも、作り方でも、もちろん勉強会でわからなかったことでも。

(特に勉強会の内容でないと行けないわけではありません。一人の疑問が全員に広く伝わる
ことで困ってる人の助けになることもありますから!)

山口 優 <sansou.andro...@gmail.com>さん:

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


--------------------------------
真鍋 洋一郎(Yoichiro Manabe)
mail:uky...@gmail.com

生座本義勝

unread,
Jun 6, 2011, 9:19:52 AM6/6/11
to android-grou...@googlegroups.com
生座本です。

質問大歓迎です。どんどんMLを活用して下さい。
ListViewの質問内容を送って下さい。

2011年6月6日22:13 uky...@gmail.com <uky...@gmail.com>:
このグループから退会するには、android-group-japa...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan-chiba?hl=ja からこのグループにアクセスしてください。


shimo

unread,
Jun 6, 2011, 9:22:42 AM6/6/11
to android-grou...@googlegroups.com
山口さん

ありがとうございます。

やりたいことは、ListViewとボタンを用意して、ボタンを押したときにListView
を「スムーズ」にスクロールさせたいと思っていま す。
添付ファイルに画像を付けました。

【環境】
1.6以上で動く

【試してみたこと】
1.
指でスクロールした事を擬似的にイベントを起こしてあげればいいのではないか
とMotionEventのUPとMOVEとDOWNを OnTouchに送ってあげたのですが、自分の
持っているIS03やエミュレータではスムーズにスクロールしたのですが、端末に
よってはスクロー ル自体しませんでした。

2.
「Handle.postDelayed」を使って非同期にListView.setSelection()を呼び出し
てみたのですが、一行一行 移動してしまうのでスムーズにスクロール出来ませ
んでした。

3.
「Handle.postDelayed」を使って非同期にListView.setSelectionFromTop()を呼
び出してみたので すが、スムーズなスクロールにしようとすると、スクロール
が遅すぎてしまいます。

という所で詰まってしまい、普通はこうする等、いい案があれば教えていただき
たいと思います。

最悪AdapterViewを拡張してListViewみたいなのを作るとかになるのでしょうか。

よろしくお願いします。

--
o1234...@hotmail.com

shimo

listview.jpg

山口 優

unread,
Jun 6, 2011, 9:59:26 AM6/6/11
to android-grou...@googlegroups.com
shimoさん

山口です。
せっかく質問して頂いたのに私では簡単にお答えする事ができそうにありません
でした;
お役に立てずすみませんm(_ _)m

どなたか分かる方いらっしゃいませんか~?

山口 優

unread,
Jun 6, 2011, 10:38:19 AM6/6/11
to android-grou...@googlegroups.com
shimoさん

山口です。
何度もすみません。

ListViewの自動スクロールについてですが、
API Level 8以上(Android 2.2以上)からのメソッドで
ListViewのsmoothScrollToPositionというメソッドがありました。

自分で実際使用してみたところ、スピードが速いような気がしましたが、
自動スクロールのような事が実現できていたように感じました。

shimoさんが条件で出されているAndroid 1.6以上の環境という
対象からするとこのメソッドの使用は不可能ですが、、、

そこで、ちょっと時間がかかるかもしれませんが、
ListViewのソースコードを取得してそのsmoothScrollToPosition
メソッドがどんな事をやっているのか確認してみようと思います。

実は私はAndroid初心者みたいなもので、Gitからソースコード取得
などはやってきていなかったため、良い機会ですのでチャレンジしてみようと思
います。

shimoさんの望まれている良い結果が出せるかはわかりませんが、
自分の勉強もかねてやってみます。


(2011/06/06 22:22), shimo wrote:

生座本義勝

unread,
Jun 6, 2011, 10:49:35 AM6/6/11
to android-grou...@googlegroups.com
生座本です。

すいません使用しているマシンでEmutatorが上がらないので
明日確認してみます。

2011年6月6日23:38 山口 優 <sansou.andro...@gmail.com>:

shimo

unread,
Jun 6, 2011, 10:54:56 AM6/6/11
to android-grou...@googlegroups.com
山口さん

ありがとうございます。

参考になるか分かりませんが、アンドロイドマーケットでダウンロード出来る
ツールを見ていると、
いろんなツールでListViewのスクロールが実現されており(2.1端末で動作確認)
結構簡単に出来るのかな?と思って質問しました。

自分もプログラミング初心者(Androidは尚更)なので同じようにソースをみて
みようと思います。

なにか分かればメーリングリストで回答させていただきます。
ありがとうございました。

kyuji

unread,
Jun 6, 2011, 10:17:58 PM6/6/11
to android-grou...@googlegroups.com, shimo
shimoさん

唐澤です。
ちょっと気になったので、作ってみました。
1.6で動きます。
ListViewのsetSelectionFromTopとgetFirstVisiblePositionを使っています。
スクロールの移動距離は、MoveP で設定してください。
試してみてください。バグってたらすみません。

public class Main extends Activity {
final int _MoveP = 1; // スクロールの移動数
ListView _ListView;
Button _UpButton;
Button _DownButton;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

int idx;
ArrayAdapter<String> adapter;

_ListView = (ListView)this.findViewById(R.id.listView1);
_UpButton = (Button)this.findViewById(R.id.button1);
_DownButton = (Button)this.findViewById(R.id.button2);

adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
for(idx = 0;idx < 100;idx++){
adapter.add(String.valueOf(idx));
}
// アダプターを設定
_ListView.setAdapter(adapter);

// ListViewを下へスクロール
_DownButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
if(_ListView.getFirstVisiblePosition() + _MoveP < _ListView.getCount()){
_ListView.setSelectionFromTop(_ListView.getFirstVisiblePosition() + _MoveP , 0);
}else{
_ListView.setSelectionFromTop(_ListView.getCount() , 0);
}
}});

// ListViewを上へスクロール
_UpButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
if(_ListView.getFirstVisiblePosition() - _MoveP > 0){
_ListView.setSelectionFromTop(_ListView.getFirstVisiblePosition() - _MoveP , 0);
}else{
_ListView.setSelectionFromTop(0 , 0);
}
}});
}
}

以上

shimo

unread,
Jun 6, 2011, 10:41:34 PM6/6/11
to android-grou...@googlegroups.com
唐澤さん

ありがとうございます。

試してみたのですが、setSelectionFromTopを使用した移動だと
「スムーズ」なスクロールが出来ない。という事で申し訳ないですが違います。

また、setSelectionFromTopの第2引数を少しずつ増やしながら
画面スクロールさせても、一番最初のメール(3)で質問で書かせて頂いた通り
スクロールが遅すぎて使えない結果になってしまいます。


自分の中ではinvalidate()を使用して描画しなおしながらスクロールさせていく感じで実現をするのかなと思ったりしていますがちょっと忙しくて手がつけられていない感じです。


明日の昼までメールを見ることが出来ないので返信が出来なくなるかもしれませんが
また何かわかればよろしくお願いします。

shimo

unread,
Jun 6, 2011, 10:50:14 PM6/6/11
to android-grou...@googlegroups.com
唐沢さん

shimoです。

よく考えると、「スムーズ」というのが曖昧だったのかもしれないので追記させ
ていただきます。

自分の考える「スムーズ」とは指で画面をなぞってスクロールさせるように滑ら
かなスクロールの事を意味しています。
ScrollViewだとsmoothScrollメソッドがあるのに何でListViewは2.2からなの
か・・・

ScrollViewにList風にしたLinerLayoutを入れてスクロールという案も考えたの
ですが
表示したい行数が多いのと、いろんなツールがListViewのスクロールを実現して
いるので
やはりListViewで実現したいところです。




(2011/06/07 11:17), kyuji wrote:

shimo

unread,
Jun 6, 2011, 11:04:39 PM6/6/11
to android-grou...@googlegroups.com
shimoです。

なんども申し訳ありません。

試してみた実装はバックアップ取っていなかったので、当時の残骸と思い出で作った
最初の質問の(1)と(3)のソースを添付しておきます。

(2011/06/07 11:17), kyuji wrote:

postDelayed.txt
MotionEvent.txt

ぱーかーぴーたー

unread,
Jun 6, 2011, 11:15:56 PM6/6/11
to android-grou...@googlegroups.com
唐沢さん

ぴーたーです。

ファローしていただき、ありがとうございます。
今後とも、宜しくお願いいたします。

みなさん、本気でAndroidアプリをいじってるんですね。
最近、私は本業が忙しく、家に帰ると寝るだけの生活なので
触るところまで行けないです。

みなさんに置いてけぼりにならないように、暇を見つけて触るように心がけます。

以上

2011年6月7日12:04 shimo <o1234...@hotmail.com>:

kyuji

unread,
Jun 7, 2011, 12:28:21 AM6/7/11
to android-grou...@googlegroups.com, shimo
shimoさん

唐澤です。
すみません、二日酔いで、ちゃんと投稿したメール読んでませんでした。
スムーズがポイントですね。
確かにターゲットが1.6となると、ListViewにはsmoothScrollがないですね。
私も、ScrollViewのsmoothScrollByで試してみましたが、スムーズです。
これをListViewで実現する方法を、私も考えてみたいと思います。

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

生座本義勝

unread,
Jun 7, 2011, 10:07:31 AM6/7/11
to android-grou...@googlegroups.com
生座本です。

shimoさんが試された「Motion.Event」を試してみましたが、2.1Update1までは
正常にEventが送られるのですが、2.2以降はEventが発生していない状態では
送られない事象になっています。

どなたかこの事象を解決されていればフォローをお願いしますm(__)m

実機確認として、Lynx3D,LiftTouchで確認しましたがLifetouchがNGでした。

2011年6月7日13:28 kyuji <kyuj...@gmail.com>:

kyuji

unread,
Jun 7, 2011, 11:07:39 PM6/7/11
to android-grou...@googlegroups.com
唐澤です。

本件について、参考になるかわかりませんが、面白い資料がありましたので紹介させて頂きます。
日本Android会のadamrockerと矢野りんさんが、HorizontalScrollViewにsmoothScrollByを
実装するサンプルを紹介しています。(easingの実装)
http://www.adamrocker.com/blog/wp-content/uploads/2010/03/devfest_rockrin.pdf

HorizontalScrollViewのPrivateなScrollerを取得し、smoothScrollByを独自に実装しています。
これをListViewで試してみましたが、mFlingRunnableからmScrollerを取得することは出来
ましたが、easingの実装までは出来ませんでした。
Scrollerの使い方がよくわからないです・・・

Motion.Eventは試していませんが、2.2以降で動かない件、shimoさん如何でしょうか。

以上

shimo

unread,
Jun 8, 2011, 7:09:40 PM6/8/11
to android-grou...@googlegroups.com
唐沢さん

昨日から忙しくて見れていません。
MotionEventを使う方法は簡単ですが、2.2で全く動かないのであれば
今回うまくいってもまた別versionで・・・・ということになりかねないので
別の視点で実装しようかなと考えています。


ListViewのスクロールについては週末に考えようとおもいます。

shimo

unread,
Jun 9, 2011, 10:15:05 AM6/9/11
to android-grou...@googlegroups.com
shimoです。

ListViewをボタン契機でスクロールする件ですが、理想に近い実装が出来ました。
(結局MotionEventで実装しました)
ただ、不安定なのでもう少しいろんなパターンに対応する形で修正していけばいけると思います。

まだ調査していただいており他の方法があれば教えていただけると助かります。
また、以下のソースが動かないパターンや、こうすると良いなどあれば大歓迎です。


実機確認は(IS03のandroid2.1 と、X06HTのandroid2.2)

以下ソースです。

        Handler h = new Handler() {
            private float y;
            private float x = 0;
            private long down;

            @Override
            public void handleMessage(Message msg) {
                int n = -1;
                int m = msg.what;
                if (m == MotionEvent.ACTION_DOWN) {
                    down = SystemClock.uptimeMillis();
                    y = 10;
                    n = MotionEvent.ACTION_MOVE;
                }
                if (m == MotionEvent.ACTION_MOVE) {
                    y -= 50;
                    if (y >= 0) {
                        n = MotionEvent.ACTION_MOVE;
                    } else {
                        n = MotionEvent.ACTION_UP;
                    }
                }
                MotionEvent ev = MotionEvent.obtain(down, SystemClock.uptimeMillis(), m, x, y, 0);
                ListView.dispatchTouchEvent(ev);
                if (n != -1) sendEmptyMessage(n);
            }
        };
        h.sendMessage(h.obtainMessage(MotionEvent.ACTION_DOWN, 0, 0));

以上です。



(2011/06/08 12:07), kyuji wrote:

shimo

unread,
Jun 10, 2011, 7:19:19 AM6/10/11
to android-grou...@googlegroups.com
shimoです。

なんだか自分で自分に返信している感じになってきましたが、、、
ListViewをボタン契機でスクロールする件については以下2つの解決案を共有して
おわりにしようと思います。

1.
http://www.anddev.org/dynamic_smooth_scrolling_listview_programmatically-t10296.html
上記のページの一番最後の回答に、「FakeMotionEventHandler」というクラスが公開されており
これを使うとスムーズに、最後ピタっと止めるスクロールが可能です。
(中身をいじることによって、永遠にスクロールさせることも可能です)
(あと、IS03では少しかくつきますがX06HTではスムーズでした)

2.
自分が最初に作っていた、MotionEventの「down」「move」「up」の3つ用意して
、一気にonTouchEvent()に渡す方法を
dispatchTouchEvent()に変更するだけでandroid2.2でも動作しました。
(こっちはIS03でもスムーズ)

※ この解決策によって、android1.6~でもListViewを音量ボタンで上下スクロールさせる事や、
本体を傾けることでスクロールさせる事が可能になり、実装の幅が広がるんじゃないかな、と思います。


以上、一緒に調査してくれた方ありがとうございました。
HorizontalScrollViewのPrivateなScrollerを取得し、smoothScrollByを独自に実装して いま す。

生座本義勝

unread,
Jun 10, 2011, 7:42:14 AM6/10/11
to android-grou...@googlegroups.com
shimoさん

生座本です。サポート出来ずに申し訳ありません<(_ _)>
情報共有ありがとうございます。参考にさせてもらいます。

2011年6月10日20:19 shimo <o1234...@hotmail.com>:

Yuji Karasawa

unread,
Jun 11, 2011, 8:43:49 AM6/11/11
to android-grou...@googlegroups.com
shimoさん

唐澤です。
本件、了解しました。
解決してよかったです。
いろいろ勉強になりました。


2011年6月10日20:19 shimo <o1234...@hotmail.com>:

shimo

unread,
Jan 9, 2012, 7:52:22 AM1/9/12
to android-grou...@googlegroups.com
お久しぶりです。
shimoです。

APIレベルによる使用クラスの条件分岐方法について、いい方法がないか相談さ
せてください。

以前唐沢さんに紹介していただいたサイトを参考に、HorizontalScrollViewのス
クロールに
アニメーションをつけてみました。
エミュレータで動かしてみると、android2.3以降のHorizontalScrollViewでは
Scrollerではなく
OverScrollerを利用しているようだったので
APIレベルを取得して、9以上(android2.3)だった場合はOverScrollerを利用す
るように実装しました。
>HorizontalScrollViewのPrivateなScrollerを取得し、smoothScrollByを独自に
実装して います。
>http://www.adamrocker.com/blog/wp-content/uploads/2010/03/devfest_rockrin.pdf

しかし2.2以前のバージョンで起動しようとすると、以下エラーがLogCatに出力
されて起動(その後の動作に影響はなし)
1.6に関しては機動すら出来ませんでした。
01-09 21:39:50.256: E/dalvikvm(24475): Could not find class
'android.widget.OverScroller', referenced from method
sim.sam.piko.custom.scroll.CustomScrollView.smoothScrollByApi9

例えばAndroid4.0から利用出来る便利なクラスがあった場合、
処理を分岐させてAPIレベルが高い場合は新しいクラスを利用するといった場合など
みなさんはどのように対応しているのか教えていただきたいです。
(特に1.6で起動しないというのを解決したいです)

よろしくお願いします。

>唐澤です。
>
> 本件について、参考になるかわかりませんが、面白い資料がありましたので紹
介させて頂きます。
>日本Android会のadamrockerと矢野りんさんが、HorizontalScrollViewに

noxi

unread,
Jan 9, 2012, 8:16:10 AM1/9/12
to android-grou...@googlegroups.com
noxiです。


クラス名からの予想ですが、API9以上でのみ利用出来るクラスを
API8以下でも読み込んでしまうようなコーディングをしていませんか?
存在しないクラスを読み込めば落ちるのは当然です。

例えば私の場合はScrollアクションをコントロールするクラスを作成するとして
abstract class ScrollControll
-> class ScrollControllCompat extends ScrollControll
-> class ScrollControllGinger extends ScrollControll
のようにして
API8以下ではCompatクラス、API9以上ではGingerクラスのインスタンスを作成します。
CompatでAPI9以上のものを利用しなければ落ちることはないと思います。

AndroidはAPIレベルが違うと同じクラスのメソッドでもprotectedだったりpublicだったり複雑怪奇ですので
よく調べて使わないとすぐに落ちますので気をつけましょう。


2012年1月9日21:52 shimo <o1234...@hotmail.com>:

Reply all
Reply to author
Forward
0 new messages