2011-12-29 19 views
4

ネイティブカレンダーのアジェンダと同様に、カレンダーのアジェンダを表示する必要があるアプリケーションを開発しています。私は、さまざまなイベントを表示するリストビューを持っています(注:イベントのコンテキストでは、私のシステムのエンティティです)。私はこの画面に「今日」のボタンを提供したいと思います。ユーザーがこのボタンをクリックすると、現在の1日のスケジュールの最初のイベントが画面の上になるまで、イベントはスクロールされているはずです。この問題は、今日から予定されているイベントがわずかしかない場合に発生します。画面全体を埋めるものはほとんどありません。リストビューは、カレンダーの最後のイベントが一番下になるまでスクロールします。これは、通常、最初の今日のイベントを上に置くという望ましい効果が達成されないことを意味します。最後の要素が画面の上になるまでリストビューをスクロール可能にする方法

どのようにこれを行うことができますか?私は最後にいくつかの空白の要素を追加することを考えましたが、これは醜い回避策と思われ、さらに、挿入する要素の数を教えてくれる特別なデバイス固有の計算が必要になります。

編集

public void onTodayClicked(View target) { 
    // calculate the indexOf. It works and is not related to the question 
    if (indexOf >= 0) { 
    ListView list = (ListView) findViewById(R.id.events_list_view); 
    list.setSelection(indexOf); 
    } 
} 

私はレイアウト定義が重要であることを確認していない:コメントで要求されるように

は、実は私はこのコードは誰も驚かれることでしょうわからないが、いくつかのコードを追加します質問の答えを助けるために、しかしあなたがそう考えるならば、私はそれも加えることができます。

+0

今スクロールしていますか?いくつかのコードを投稿できますか? – balazsbalazs

答えて

0

は、次の2つの方法でこれを達成することができます

  1. それが実際に順調に推移しているためsmoothScrollメソッドを使用して呼び出しsmoothScrollToPositionFromTop方法
  2. コールsetSelectionFromTop方法

が、優れている - その手段それは本当にそれにスクロールします。 唯一の欠点は、それがAPIレベル11

setSelectionFromTop方法はAPIレベル1が動作し、代わりのスムーズスクロール、それは行にジャンプした後にのみ使用可能だということです。

画面の上部に配置する必要がない場合は、行を表示するだけでなく、APIレベル8の呼び出しであるsmoothScrollToPositionを使用することもできます。あなたはこれらのメソッドをリストにFIRSTをある位置を与える場合


、彼らはうまく動作します。 (あなたの説明から私はおそらく最後のポジションを計算すると思いますが、わかりません)。

+0

答えをありがとう。しかし、私はジンジャーブレッド(Apiレベル9-10)以上のものをサポートする私の処分装置を持っていません。おそらく、将来の読者のためのあなたの提案を確認するためだけに、私はエミュレータであなたの提案をテストしますが、これは私の問題を確実に解決するものではありません。 あなたがボランティアとして古いバージョンのものを見つけようとしましたが、自分自身がアイデアを使い果たしてしまったので、私が苦労して私をさらに助けることができれば、私は最も感謝しています。 –

+0

私はちょうどあなたが提案したものをテストする機会を得ました。残念なことにあなたは私が尋ねたことを誤解しているようです。あなたが提案した方法は本当にスクロールしますが、私は既にそれを持っています。私の問題は:私は多くの項目がリストに1000と言うことを想像してください。私が40番にスクロールすると、すべてが問題なく、画面の上部に表示されます。しかし、私が '999thにスクロールする'と言うと、このアイテムが見えるようになるまでスクロールし、上に置かない。なぜなら、線形レイアウトの後に空きスペースがないからです(おそらく?)。私はすべてのアイテムを上に置く必要があります。 –

+0

ああ、私は誤解した。 しかし、残念なことに、ListViewでは、実行したいことはできません。 できることは、getFirstVisiblePosition()、getChildAtIndex()、getTop()メソッドを使用して必要な高さを計算してから、リストの最後に行を挿入することです。あなたがいくつかのことをしなければならないので、それは簡単ではありません。 – balazsbalazs

関連する問題