こんにちは
第2回勉強会に参加させていただいて(PCは持って行きませんでしたが)
自分でも何かツールを作成しようと始めました。
ListViewの実装でわからない箇所が出てきたのですが、このメーリングリストで
質問しても良いでしょうか?
しもてぃ
千葉支部@山口です。
実装の質問に関して千葉支部のメーリングリストへ投稿されるのは
基本的に問題ないと考えております。
ちなみにListViewでどのあたりが不明でしょうか?
個人的には千葉支部のメーリングリストでは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
このグループから退会するには、android-group-japa...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan-chiba?hl=ja からこのグループにアクセスしてください。
ありがとうございます。
やりたいことは、ListViewとボタンを用意して、ボタンを押したときにListView
を「スムーズ」にスクロールさせたいと思っていま す。
添付ファイルに画像を付けました。
【環境】
1.6以上で動く
【試してみたこと】
1.
指でスクロールした事を擬似的にイベントを起こしてあげればいいのではないか
とMotionEventのUPとMOVEとDOWNを OnTouchに送ってあげたのですが、自分の
持っているIS03やエミュレータではスムーズにスクロールしたのですが、端末に
よってはスクロー ル自体しませんでした。
2.
「Handle.postDelayed」を使って非同期にListView.setSelection()を呼び出し
てみたのですが、一行一行 移動してしまうのでスムーズにスクロール出来ませ
んでした。
3.
「Handle.postDelayed」を使って非同期にListView.setSelectionFromTop()を呼
び出してみたので すが、スムーズなスクロールにしようとすると、スクロール
が遅すぎてしまいます。
という所で詰まってしまい、普通はこうする等、いい案があれば教えていただき
たいと思います。
最悪AdapterViewを拡張してListViewみたいなのを作るとかになるのでしょうか。
よろしくお願いします。
shimo
山口です。
せっかく質問して頂いたのに私では簡単にお答えする事ができそうにありません
でした;
お役に立てずすみませんm(_ _)m
どなたか分かる方いらっしゃいませんか~?
山口です。
何度もすみません。
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:
ありがとうございます。
参考になるか分かりませんが、アンドロイドマーケットでダウンロード出来る
ツールを見ていると、
いろんなツールでListViewのスクロールが実現されており(2.1端末で動作確認)
結構簡単に出来るのかな?と思って質問しました。
自分もプログラミング初心者(Androidは尚更)なので同じようにソースをみて
みようと思います。
なにか分かればメーリングリストで回答させていただきます。
ありがとうございました。
唐澤です。
ちょっと気になったので、作ってみました。
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);
}
}});
}
}
以上
ありがとうございます。
試してみたのですが、setSelectionFromTopを使用した移動だと
「スムーズ」なスクロールが出来ない。という事で申し訳ないですが違います。
また、setSelectionFromTopの第2引数を少しずつ増やしながら
画面スクロールさせても、一番最初のメール(3)で質問で書かせて頂いた通り
スクロールが遅すぎて使えない結果になってしまいます。
自分の中ではinvalidate()を使用して描画しなおしながらスクロールさせていく感じで実現をするのかなと思ったりしていますがちょっと忙しくて手がつけられていない感じです。
明日の昼までメールを見ることが出来ないので返信が出来なくなるかもしれませんが
また何かわかればよろしくお願いします。
唐沢さん shimoです。 よく考えると、「スムーズ」というのが曖昧だったのかもしれないので追記させ ていただきます。 自分の考える「スムーズ」とは指で画面をなぞってスクロールさせるように滑ら かなスクロールの事を意味しています。 ScrollViewだとsmoothScrollメソッドがあるのに何でListViewは2.2からなの か・・・ ScrollViewにList風にしたLinerLayoutを入れてスクロールという案も考えたの ですが 表示したい行数が多いのと、いろんなツールがListViewのスクロールを実現して いるので やはりListViewで実現したいところです。 (2011/06/07 11:17), kyuji wrote:
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 からこのグループにアクセスしてください。
HorizontalScrollViewのPrivateなScrollerを取得し、smoothScrollByを独自に実装して いま す。
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に
クラス名からの予想ですが、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>: