带有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 【问题描述】:

我是中国人,我的英语很差。当我使用ViewPagerListViewListViewViewPager 中添加)和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中的简单适配器

带有 BaseAdapter 的 Android ListView 内的 ImageButton

带有 ListView 的 Android 可点击小部件在 ListItems 上不可点击