リクエストに応じて追加のビューを取得するリストビューがあり、これは BaseAdapter によって維持されます。更新後にスクロール位置を維持するにはどうすればよいですか?
これが数回尋ねられたことは知っていますが、毎回adapter.notifyDataSetChanged();
、リストの内容を含む ArrayList を更新した後に呼び出すという同じ解決策が提案されました。
スクロール位置が維持されるようにするにはどうすればよいですか?
リクエストに応じて追加のビューを取得するリストビューがあり、これは BaseAdapter によって維持されます。更新後にスクロール位置を維持するにはどうすればよいですか?
これが数回尋ねられたことは知っていますが、毎回adapter.notifyDataSetChanged();
、リストの内容を含む ArrayList を更新した後に呼び出すという同じ解決策が提案されました。
スクロール位置が維持されるようにするにはどうすればよいですか?
をアクティビティ クラスに実装し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);
これが役立つことを願っています。
私がとるアプローチは、更新後にListView.setSelection(position)
目的の場所までスクロールするように呼び出すことです。position
どこから呼び出しているかによっては、アイテムが適切に配置されるようにするために、呼び出すrequestFocusFromTouch
前に呼び出す必要がある場合があります。setSelection
これを試すことができます:
//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);