带有ListView的Android ViewPager在调用notifyDatasetchanged时无法记住最后一个位置
Posted
技术标签:
【中文标题】带有ListView的Android ViewPager在调用notifyDatasetchanged时无法记住最后一个位置【英文标题】:Android ViewPager with ListView can not remember the last position when called notifyDatasetchanged 【发布时间】:2016-04-02 22:50:24 【问题描述】:我是中国人,我的英语很差。当我使用ViewPager
和ListView
(ListView
在ViewPager
中添加)和PagerAdapter
模式为 POSITION_NONE 时遇到问题,我在 PagerAdapter 中使用 List 保存了膨胀的ListView
,但奇怪的现象是当我调用 pagerAdapter.notifyDataSetChanged 时,ListView
滚动到第一个位置。这里是代码:
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);
【问题讨论】:
嗨阳光,当您刷新父布局时,子布局也会刷新,这就是您的列表视图也刷新的原因。 (根据我的观点)。 但是当视图膨胀时,我将每个页面都保存在 pageAdapter 中,例如第一个 listview 并且不会膨胀 xml,除了第一次在 instantiateItem 中 【参考方案1】:您可以使用此逻辑...在调用 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);
【讨论】:
非常感谢,但第一种方法似乎不适合我以上是关于带有ListView的Android ViewPager在调用notifyDatasetchanged时无法记住最后一个位置的主要内容,如果未能解决你的问题,请参考以下文章
带有 ListView 的 Android 小部件无法正确加载项目
带有 onClick 项目的 Android ListView
带有集合(ListView)的Android小部件不显示项目
带有arraylist的listview,android中的简单适配器