Android 带有 ListView 的 ViewPager 在调用 notifyDatasetchanged 时无法记住最后一个位置
Android ViewPager with ListView can not remember the last position when called notifyDatasetchanged
我是中国人,我的英语很差。当我使用 ViewPager
和 ListView
(ListView
在 ViewPager
中添加)并且 PagerAdapter
模式是 POSITION_NONE 时遇到问题,我保存了在 PagerAdapter 中用 List 膨胀 ListView
但奇怪的现象是当我调用 pagerAdapter.notifyDataSetChanged 时 ListView
滚动到第一个 position.Here 是代码:
private class MyAdapter2 extends PagerAdapter {
@Override
public int getCount() {
return 4;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view==object;
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(listviews[position], 0);
return listviews[position];
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
您可以使用此逻辑...在调用 dataSetChanged 之前将此列表视图状态存储在 Parcelable
变量中,并在 dataSetChanged 时间之后从您存储在可打包变量中的值恢复列表视图
像这样..
Parcelable scrollPos=listview.onSaveInstanceState();
// call your pagerAdapter.notifyDataSetChanged
if(scrollPos != null)
{
listview.onRestoreInstanceState(scrollPos);
}
我从 here
找到了另一种方法
// save index and top position
int index = mList.getFirstVisiblePosition();
View v = mList.getChildAt(0);
int top = (v == null) ? 0 : v.getTop();
// notify dataset changed or re-assign adapter here
// restore the position of listview
mList.setSelectionFromTop(index, top);
我是中国人,我的英语很差。当我使用 ViewPager
和 ListView
(ListView
在 ViewPager
中添加)并且 PagerAdapter
模式是 POSITION_NONE 时遇到问题,我保存了在 PagerAdapter 中用 List 膨胀 ListView
但奇怪的现象是当我调用 pagerAdapter.notifyDataSetChanged 时 ListView
滚动到第一个 position.Here 是代码:
private class MyAdapter2 extends PagerAdapter {
@Override
public int getCount() {
return 4;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view==object;
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(listviews[position], 0);
return listviews[position];
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
您可以使用此逻辑...在调用 dataSetChanged 之前将此列表视图状态存储在 Parcelable
变量中,并在 dataSetChanged 时间之后从您存储在可打包变量中的值恢复列表视图
像这样..
Parcelable scrollPos=listview.onSaveInstanceState();
// call your pagerAdapter.notifyDataSetChanged
if(scrollPos != null)
{
listview.onRestoreInstanceState(scrollPos);
}
我从 here
找到了另一种方法 // save index and top position
int index = mList.getFirstVisiblePosition();
View v = mList.getChildAt(0);
int top = (v == null) ? 0 : v.getTop();
// notify dataset changed or re-assign adapter here
// restore the position of listview
mList.setSelectionFromTop(index, top);