6

カーソル アダプターにバインドされている ListView を含むビューがあります。カーソルの内容が変更されたら、ListView を一番上に保持したいので、カスタム カーソル アダプターに追加しました。

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

しかし、これは機能しません。次に、このアクションを次のようにキューに入れる場所を読みました。

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

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

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

編集:

試しに、ボタンを追加して、その onClickListener で scrollTo() を呼び出しましたが、機能しませんでした! 何が欠けていますか?

4

3 に答える 3

29

scrollToの代わりに、 setSelection(0)を試して、リスト ビューの一番上に移動します。

于 2012-09-19T09:27:31.080 に答える
7

リストビューのスクロールに役立つ関数を作成しました。それらはすべてのAndroidバージョン、エミュレーター、およびデバイスで機能します。ここで、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;
}
于 2012-11-16T02:59:58.447 に答える
6

ListViewは、それ自身に としてscrollTo適用されます。ListViewView

setSelection(0)リストビューのアダプターに適用されるため、トリックを行います

于 2012-09-19T09:29:04.393 に答える