Android ViewPager PagerAdapter 内容无需调用 PagerAdapter#notifyDataSetChanged Exception

标签 android android-fragments android-viewpager android-pageradapter

我的 Activity 中有一个 ViewPager。 ViewPager 在滑动寻呼机时显示不同的值。但是我得到一个 IllegalStateException:

PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! 
Expected adapter item count: 0, found: 20 
Pager id: com.exalt.vts:id/summarypager Pager class: class android.support.v4.view.ViewPager 
Problematic adapter: class com.exalt.vts.DashBoard$MyPagerAdapter

这是我的 PagerAdapter 源代码:

public class SamplePagerAdapter extends PagerAdapter{

    List<View> pages = null;

    public SamplePagerAdapter(List<View> pages){
        this.pages = pages;
    }

    @Override
    public Object instantiateItem(View collection, int position){
        View v = pages.get(position);
        ((ViewPager) collection).addView(v, 0);
        return v;
    }

    @Override
    public void destroyItem(View collection, int position, Object view){
        ((ViewPager) collection).removeView((View) view);
    }

    @Override
    public int getCount(){
        return pages.size();
    }

    @Override
    public boolean isViewFromObject(View view, Object object){
        return view.equals(object);
    }

    @Override
    public void finishUpdate(View arg0){
    }

    @Override
    public void restoreState(Parcelable arg0, ClassLoader arg1){
    }

    @Override
    public Parcelable saveState(){
        return null;
    }

    @Override
    public void startUpdate(View arg0){
    }
}

这是主要 Activity :

public class MainActivity extends Activity {
    ViewPager viewPager;
    SamplePagerAdapter myPagerAdapter;
    private TextView  textView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        List<View> pages = new ArrayList<View>();
        viewPager = (ViewPager)findViewById(R.id.myviewpager);
        myPagerAdapter = new SamplePagerAdapter(pages);
        viewPager.setAdapter(myPagerAdapter);
        viewPager.setCurrentItem(1);     

        LayoutInflater inflater = LayoutInflater.from(this);
        View page = inflater.inflate(R.layout.mylayout, null);

        for (int i = 0; i < 20; i++) {
            page = inflater.inflate(R.layout.mylayout, null);
            textView = (TextView) page.findViewById(R.id.text_view);
            textView.setText("Страница "+i);
            pages.add(page);          
        }
}

我尝试在我的 ViewPager 中添加 20 个 View ,但出现异常。

最佳答案

您需要将以下代码从当前位置移动到 for 循环之后,以便在设置数据集后设置适配器

myPagerAdapter = new SamplePagerAdapter(pages);
viewPager.setAdapter(myPagerAdapter);
viewPager.setCurrentItem(1);     

或者,您可以在 for 循环之后添加以下内容,以通知适配器自您设置以来数据集已更改

myPagerAdapter.notifyDataSetChanged();

关于Android ViewPager PagerAdapter 内容无需调用 PagerAdapter#notifyDataSetChanged Exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25302378/

相关文章:

android - fragment 中的 getActivity() 与 this.getActivity()

android tabwidget Intent 选项卡刷新每次点击

android - 在 android 中使用的颜色选择器

android - 在 ViewPager 中获取 Activity 页面并更新内容

android - 使用 onBackPressed() 进行 fragment 转换

android - 带有 ViewPager 的 TabLayout 不能在 fragment Android 中工作

Android:没有操作栏的滑动选项卡

android - 调整viewpager里面的view size,弥补tab height

android - 在垂直布局中将 2 个单选按钮并排放置(在一个 'line' 上)

java - 在哪里可以找到spring框架中HttpHeaders类的方法