ParseQueryAdapter
当启用分页时,我再次挣扎。
我有一个带有 ParseQueryAdapter 的 ListView,向我显示正确的列表。但是由于我不知道这个列表会计算多少个元素,所以我在适配器中启用了分页
setPaginationEnabled(true);
当我单击列表中的一个项目时,它会与另一个片段(比如说 B)进行交易。当我点击返回时,ListView 片段会返回(片段 A)。
片段A包含带有项目的列表。OnItemClick -> 片段B
因为我有分页但我不希望用户注意到它,所以当我到达页面末尾时,我会自动加载下一页:
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
getListView().setAdapter(adapter);
getListView().setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
final int lastItem = firstVisibleItem + visibleItemCount;
if (lastItem == totalItemCount) {
if (preLast != lastItem) { //this avoid multiple calls for the last item
preLast = lastItem;
adapter.loadNextPage();
}
}
}
});
}
问题是,当用户单击列表中的一个项目,并在 B 出现后按回,它会返回到 A,但是片段丢失了他的状态,我必须再次滚动才能返回我单击的项目所在的位置.
我现在正试图通过计算我加载的页面来恢复 A 状态,然后用类似的东西手动加载它:
@Override
public void onResume() {
// mLoadedPages is initialized with 0 and
// is incremented each time I load a page
if (mLoadedPages != 0) {
for (int i = 0; i < mLoadedPages; i++) {
adapter.loadNextPage();
}
getListView().setSelection(mLastKnownFirstItem);
}
super.onResume();
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putInt("mLoadedPages", mLoadedPages);
savedInstanceState.putInt("mLastKnownFirstItem", getListView().getFirstVisiblePosition());
}
@Override
public void onViewStateRestored(Bundle savedInstanceState) {
super.onViewStateRestored(savedInstanceState);
if (savedInstanceState != null) {
mLoadedPages = savedInstanceState.getInt("mLoadedPages");
mLastKnownFirstItem = savedInstanceState.getInt("mLastKnownFirstItem");
}
}
这看起来非常粗鲁、野蛮而且一点也不优雅(而且这段代码也给了我IndexOutOfBoundsException)。有人知道我怎样才能摆脱这个问题吗?
先感谢您。