Android ListView - 在更新时滚动回到顶部

aja*_*n81 6 android android-ui android-listview android-adapter

我有一个listview,可以根据请求添加其他视图,由BaseAdapter维护.更新后如何保持滚动位置?

我知道这已被问了几次,但每次都提出了相同的解决方案,我已经尝试过,这是adapter.notifyDataSetChanged();在更新包含列表内容的ArrayList之后调用的.

如何确保保持滚动位置?

She*_*ara 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您AsyncTask用于更新数据,则可以在您的服务PostExecute()中包含以下内容以保持Scroll位置:

list.setAdapter(adapter);
list.setSelectionFromTop(currentFirstVisibleItem, 0);
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.


Cod*_*oet 5

我采取的方法是在更新后调用ListView.setSelection(position)滚动到所需position的方法.

根据您呼叫的位置,您可能需要在呼叫requestFocusFromTouch之前拨打电话setSelection,以确保项目的位置正确.