Содержимое Android ViewPager PagerAdapter без вызова PagerAdapter#notifyDataSetChanged Exception

У меня есть 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){
    }
}

Это основная активность:

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);          
        }
}

Я пытаюсь добавить 20 представлений в свой ViewPager, но получаю исключение.


person BekaKK    schedule 14.08.2014    source источник
comment
У меня была та же проблема, и я нашел решение здесь Мое решение   -  person Amt87    schedule 25.08.2015


Ответы (1)


Вам либо нужно переместить следующий код из того места, где он находится в настоящее время, после цикла for, чтобы адаптер был установлен после настройки вашего набора данных.

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

или, в качестве альтернативы, вы можете добавить следующее после цикла for, чтобы уведомить адаптер о том, что набор данных изменился с момента его настройки.

myPagerAdapter.notifyDataSetChanged();
person HexAndBugs    schedule 14.08.2014