【发布时间】:2014-08-18 12:30:56
【问题描述】:
更新
基本上,bbrakenhoff 已经回答了我的问题,但还有一件事需要解决。如何更新我的 EndlessFeedAdapter (mEndlsFidAdptr) 的内容?我需要清除该项目,然后重新加载。我正在使用 CWAC EndlessAdapter。是否有清除内容的技巧或者只编写一个方法会更容易?完成此操作后,应保持滚动位置。
我正在从服务器获取数据并在内容更改时更新我的 EndlessFeedAdapter。每次我更新我的适配器并重新加载内容时。问题是重新加载后我的列表会跳回顶部,因为我的滚动位置没有保持。我已经广泛尝试了 setSelection 和 setSelectionFromTop,但没有积极的结果。
适配器更新后如何保持滚动位置?
我一直在通过论坛寻找答案,但似乎没有任何效果。
这些我都试过了:Maintain/Save/Restore scroll position when returning to a ListView
这不起作用:
int index = mList.getFirstVisiblePosition();
View v = mList.getChildAt(0);
int top = (v == null) ? 0 : v.getTop();
// restore index and position
mList.setSelectionFromTop(index, top);
也不是这样:
// Save ListView state
Parcelable state = listView.onSaveInstanceState();
// Set new items
listView.setAdapter(adapter);
// Restore previous state (including selected item index and scroll position)
listView.onRestoreInstanceState(state);
也不是其他解决方案,例如设置可运行文件或设置 scrollPositionY。当我从不同的列表加载时,设置 notifyDataChanged 不起作用。
我的代码:
private void showFeed() {
if (mFeedActivity.mInFeed) {
mQuickReturnView.setVisibility(View.VISIBLE);
} else {
mQuickReturnView.setVisibility(View.GONE);
}
Activity actvt= getActivity();
if (actvt == null || mFeedListView == null) return;
actvt.invalidateOptionsMenu();
mFeedListView.setVisibility(View.VISIBLE);
//updated with help from response
if (mAdapter == null){
mAdapter = new FeedAdapter(actvt, 0, mFeed.getItems().getFeedItemList(), this);
} else {
mAdapter.clear();
mAdapter.addAll(mFeed.getItems().getFeedItemList());
mAdapter.notifyDataSetChanged();
}
mEndlsFidAdptr = new EndlessFeedAdapter(actvt, mAdapter, R.layout.progress_row, mFeed.isShowMoreBar(),
mEndlsFidAdptr.setRunInBackground(false);
//Parcelable state = mFeedListView.onSaveInstanceState();
mFeedListView.setAdapter(mEndlsFidAdptr);
//mFeedListView.onRestoreInstanceState(state);
mFeedListView.setSelectionFromTop(mFirstVisibleItem, mVisibleItemOffset);
if(!(mFeedScope.equalsIgnoreCase(FeedScope.BOOKMARKS.xmlValue()) ||
mFeedScope.equalsIgnoreCase(FeedScope.DOCUMENT.xmlValue()) ||
mFeedScope.equalsIgnoreCase(FeedScope.NOTIFICATIONS.xmlValue()) ||
mFeedScope.equalsIgnoreCase(FeedScope.RECEIVED_TASKS.xmlValue()) ||
mFeedScope.equalsIgnoreCase(FeedScope.SEND_TASKS.xmlValue()))) {
mFeedListView.getViewTreeObserver().addOnGlobalLayoutListener(mGlobalLayoutListener);
mFeedListView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
mCanShowHide = scrollState == SCROLL_STATE_FLING;
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
View v = mFeedListView.getChildAt(0);
//View v = null;
if(!mFeedActivity.mInFeed || v == null)
return;
int top = v.getTop();
if(mIsAnimating) {
mVisibleItemOffset = top;
mFirstVisibleItem = firstVisibleItem;
return;
}
boolean hide = false;
boolean show = false;
float stickyHeight = getResources().getDimension(R.dimen.sticky_height);
if(firstVisibleItem == mFirstVisibleItem) {
if((top + stickyHeight) < mVisibleItemOffset) {
// Content scrolled down
// if shown then hide quickactionview
if(mQuickReturnShown) {
hide = true;
}
} else if (top > mVisibleItemOffset) {
// Content scrolled up
// if hidden then show quickactionview
if(!mQuickReturnShown) {
show = true;
}
}
} else if(firstVisibleItem > mFirstVisibleItem) {
// Content scrolled down
// if shown then hide quickactionview
if(mQuickReturnShown) {
hide = true;
}
} else if (firstVisibleItem < mFirstVisibleItem) {
// Content scrolled up
// if hidden then show quickactionview
if(!mQuickReturnShown) {
show = true;
}
}
if((show && mCanShowHide) || (top == 0 && !mQuickReturnShown)) {
mTranslateAnimation = new TranslateAnimation(0, 0, -mQuickReturnHeight, 0);
mTranslateAnimation.setDuration(DURATION_MILLIS);
mTranslateAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
mIsAnimating = true;
}
@Override
public void onAnimationEnd(Animation animation) {
mIsAnimating = false;
mQuickReturnShown = true;
mQuickReturnView.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
mQuickReturnView.startAnimation(mTranslateAnimation);
}
if(hide) {
mTranslateAnimation = new TranslateAnimation(0, 0, 0, -mQuickReturnHeight);
mTranslateAnimation.setDuration(DURATION_MILLIS);
mTranslateAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
mIsAnimating = true;
}
@Override
public void onAnimationEnd(Animation animation) {
mIsAnimating = false;
mQuickReturnShown = false;
mQuickReturnView.setVisibility(View.GONE);
}
@Override
public void onAnimationRepeat(Animation animation) { }
});
mQuickReturnView.startAnimation(mTranslateAnimation);
}
mVisibleItemOffset = top;
mFirstVisibleItem = firstVisibleItem;
}
});
} else {
mFeedListView.setOnScrollListener(null);
}
mFeedListView.setSelectionFromTop(mFirstVisibleItem, mVisibleItemOffset);
//mFeedListView.scrollTo(mCurrentX,mCurrentY);
if(mFeed.getItems().getFeedItemList().size() == 0) {
mEmptyFeedView.setVisibility(View.VISIBLE);
}
}
【问题讨论】:
-
你尝试使用getScrollPosition然后设置scrollPOsition吗?
-
是的,我试过在onScroll方法中设置滚动位置,然后在方法的最后调用scrollTo(可以看到注释掉的实现)
-
你在哪里添加新项目?
-
它们是通过调用添加的 - mFeed.getItems().getFeedItemList()。这会调用我的休息服务。