6

リクエストに応じて追加のビューを取得するリストビューがあり、これは BaseAdapter によって維持されます。更新後にスクロール位置を維持するにはどうすればよいですか?

これが数回尋ねられたことは知っていますが、毎回adapter.notifyDataSetChanged();、リストの内容を含む ArrayList を更新した後に呼び出すという同じ解決策が提案されました。

スクロール位置が維持されるようにするにはどうすればよいですか?

4

5 に答える 5

12

をアクティビティ クラスに実装しOnScrollListener、次のコードを使用します。

int currentFirstVisibleItem, currentVisibleItemCount, currentTotalItemCount;
public void onScroll(AbsListView view, int firstVisibleItem,
        int visibleItemCount, int totalItemCount) {
    this.currentFirstVisibleItem = firstVisibleItem;
    this.currentVisibleItemCount = visibleItemCount;
    this.currentTotalItemCount = totalItemCount;
}

public void onScrollStateChanged(AbsListView view, int scrollState) {
    this.currentScrollState = scrollState;
    this.isScrollCompleted();
}

private void isScrollCompleted() {

    if (currentFirstVisibleItem + currentVisibleItemCount >= currentTotalItemCount) {
        if (this.currentVisibleItemCount > 0
                && this.currentScrollState == SCROLL_STATE_IDLE) {

            //Do your work
        }
    }
}

AsyncTaskデータの更新にを使用している場合はPostExecute()、スクロール位置を維持するために以下を含めることができます。

list.setAdapter(adapter);
list.setSelectionFromTop(currentFirstVisibleItem, 0);

これが役立つことを願っています。

于 2012-08-13T10:29:39.057 に答える
5

私がとるアプローチは、更新後にListView.setSelection(position)目的の場所までスクロールするように呼び出すことです。position

どこから呼び出しているかによっては、アイテムが適切に配置されるようにするために、呼び出すrequestFocusFromTouch前に呼び出す必要がある場合があります。setSelection

于 2012-08-09T06:35:36.607 に答える
2

これを試すことができます:

//Get the top position from the first visible element
int fVisible = list.getFirstVisiblePosition();
View vFirst = list.getChildAt(0);
int pos = 0;
if (vFirst != null) pos = vFirst.getTop();

//Restore the position
list.setSelectionFromTop(fVisible, pos);
于 2012-08-09T06:40:57.537 に答える