2012-09-19 12 views
5

私は、カーソルアダプタにバインドされたListViewを含むビューを持っています。カーソルの内容が変更されたら、リストビューを最上部に維持したいのですが、私のカスタムカーソルアダプターに追加しました:android ListView:scrollToは機能しません

@Override 
protected void onContentChanged() { 
    // ... 
    myListView.scrollTo(0, 0); 
} 

これは機能しません。次に、私はこのようなアクションをキューに入れるために次のように読みます:

myListView.post(new Runnable() { 
    public void run() { 
     myListView.scrollTo(0, 0); 
    } 
}); 

しかし、これはうまくいきません。

コンテンツが変更されたときに、ListViewを一番上に保持するにはどうすればよいですか?

EDIT:

だけ試しのために、私はボタンを追加し、()scrollToと呼ばれるそのonClickListenerで、それが動作しませんでした!私は何が欠けていますか?

答えて

28

scroll.の代わりに、setSelection(0)をリストビューの先頭に移動してください。

+3

IT WORKS !!しかし、なぜ??なぜscrollTo()がうまくいかないのですか? – Alexis

+1

@jafarこれはうまくいくはずです。 ListViewのscrollToはListView自体に適用されますが、リストビューはスクロール可能ではないため、結果は何もありません。 setSelectionは、リストビューのアダプタに適用されるため、トリックを行います – weakwire

+0

あなたの問題を解決すれば答えをマークしてください...ありがとう –

5

のListViewのscrollToはそれが私がリストビューのスクロールのために他人のために有用である可能性の機能を作っ

+0

'setSelection'は' adapter.notifyDataSetChanged() 'の後に呼び出される必要があることにも注意してください。 – TWiStErRob

5

リストビューのアダプタに適用されるため、彼らがトリック働くんView

setSelection(0)としてListViewその自己に適用されます私はすべてのアンドロイド版、エミュレータ、デバイスで、ここでitemheightはリストビュー内の固定された高さです。

int itemheight=60; 
public void scrollToY(int position) 
{ 
    int item=(int)Math.floor(position/itemheight); 
    int scroll=(int) ((item*itemheight)-position); 
    this.setSelectionFromTop(item, scroll);// Important 
} 
public void scrollByY(int position) 
{ 
    position+=getListScrollY(); 
    int item=(int)Math.floor(position/itemheight); 
    int scroll=(int) ((item*itemheight)-position); 
    this.setSelectionFromTop(item, scroll);// Important 
} 
public int getListScrollY() 
{ 
    try{ 
    //int tempscroll=this.getFirstVisiblePosition()*itemheight;// Important 
    View v=this.getChildAt(0); 
    int tempscroll=(this.getFirstVisiblePosition()*itemheight)-v.getTop();// Important 
    return tempscroll; 
    }catch(Exception e){} 
    return 0; 
} 
+0

上記の関数は、継承/拡張するクラスに追加する必要があります。ListView – Diljeet

+0

ハードコーディングの高さは良い考えではありません。リストは混合要素と可変長の複数行テキストを処理できます。また、私は実際のクラスを拡張する必要のないたくさんのファンシーな 'ListView'を書いていました。アダプタから取得した後、特定の項目の高さについて 'View.measure(int、int)'を呼び出すことを考えてください。 – TWiStErRob

+0

あなたは正しいハードコーディングの高さですが正しいアプローチではありませんが、一般的に使用されるリストビューには高さ要素が固定されており、スクロール機能は機能しません。 "View.measure(int、int)"これはあなたのニーズに合わせてどのように修正するのか、あなた次第です。 – Diljeet

関連する問題