Java.lang.IllegalStateException: приложение PagerAdapter изменило содержимое адаптера без вызова PagerAdapter # notifyDataSetChanged android

Я пытаюсь использовать статический класс для передачи значения в представление вместо использования намерения, поскольку мне нужно передать большой объем данных. Иногда я получаю эту ошибку и не могу узнать, что является основной причиной.

Ошибка: -

java.lang.IllegalStateException: The application PagerAdapter changed the adapter contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 101, found: 200

Класс моего пейджера

public class MemeDetailActivity extends AppCompatActivity implements OnDialogClickListner<Void> {
    private ViewPager mPager;
    private List<Datum> mList;
    private ScreenSlidePagerAdapter pagerAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_meme_detail);
        mList = DataResult.getInstance().getData();
        DataResult.getInstance().resetData();
        if (mList != null)
            startPager(selected_position);
        else
            Toast.makeText(this, "Error loading data", Toast.LENGTH_SHORT).show();
        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
    }

    private void startPager(int position) {
        pagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
        mPager.setAdapter(pagerAdapter);
        pagerAdapter.notifyDataSetChanged();
        mPager.setOffscreenPageLimit(0);
        mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                new Interactors(MemeDetailActivity.this).updateView(Util.getAccessToken(), mList.get(position).getId(), new OnFinishListner<ViewsRM>() {
                    @Override
                    public void onFinished(ViewsRM result) {

                    }

                    @Override
                    public void onFailed(String msg) {
                    }
                });
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
        mPager.setCurrentItem(position);
    }

    public class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
        SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();

        public ScreenSlidePagerAdapter(FragmentManager fm) {
            super(fm);
        }


        //todo entry point 3 : showing the image in the viewpager
        @Override
        public Fragment getItem(int position) {
            Fragment fragment = new fragment_mypager_new();
            Bundle bundle = new Bundle();
            if (frmMyMemes)
                bundle.putParcelable("MY_DATA", myList);
            bundle.putSerializable("DATA", mList.get(position));
            fragment.setArguments(bundle);
            return fragment;
        }

        @Override
        public int getItemPosition(Object object) {
            return POSITION_NONE;
        }

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

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            Fragment fragment = (Fragment) super.instantiateItem(container, position);
            registeredFragments.put(position, fragment);
            return fragment;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            registeredFragments.remove(position);
            super.destroyItem(container, position, object);
        }

        public Fragment getRegisteredFragment(int position) {
            return registeredFragments.get(position);
        }
    }

}

Мой статический класс

public class DataResult<T> {

    private static DataResult instance;
    private List<T> data = null;

    protected DataResult() {

    }

    public static synchronized DataResult getInstance() {
        if (instance == null) {
            instance = new DataResult();
        }
        return instance;
    }

    public List<T> getData() {
        return data;
    }

    public void setData(List<T> data) {
        this.data = data;
    }

    public void resetData() {
        data = null;
    }
}

Как я называю действие

    Intent intent = new Intent(getActivity(), MemeDetailActivity.class);
    DataResult.getInstance().setData(mListA);

Ответ 1

посмотрите на свой код:

 @Override
        public int getItemPosition(Object object) {
            return POSITION_NONE;
        }

этот код используется для обновления представления при изменении вида. его также называют notifyDataSetChanged()

его необязательный метод ovverride, чтобы вы могли его удалить.

Взгляните на этот ответ: ViewPager PagerAdapter не обновляет представление

иначе вы можете изменить FragmentStatePagerAdapter на FragmentPagerAdapter

Ответ 2

Иногда эта ошибка возникает.

Вот мое предложение:

В DataResultgetData()

вернуть копию данных.

DataResult является одноточечным и содержит данные. Когда ваше представление получает данные, представление получает ссылку на данные, которую удерживает DataResult. Тогда setData() изменит ссылку data. Здесь происходит исключение IllegalStateException.

Надеюсь, что это сработает:)

Ответ 3

Я думаю, что ваш класс DataResult не нужен.

В соответствии с вашим комментарием вы получаете ошибку при обновлении набора данных. Я думаю, что вы получаете данные от какого-либо REST API или другого веб-сервиса. Затем назначьте данные, которые вы получаете из API, в временный список массивов и обновите список временных массивов при получении новых данных. Не дотрагивайтесь до переменной mListA, пока не закончите получать данные. После полного получения данных от API назначьте список временных массивов, который вы использовали для mListA непосредственно в одной строке.

mListA = tmpList;

Затем снова вызовите

mList = mListA;
pagerAdapter.notifyDataSetChanged();

Это должно решить вашу ошибку.

Ответ 4

попробуйте использовать следующий способ:

mList=new ArrayList<Datum>();
        mList.addAll(DataResult.getInstance().getData());
        DataResult.getInstance().resetData();

Ответ 5

Это может произойти потому, что вы сначала setAdapter() и notifyDataSetChanged в методе initUI();

Затем вы создаете экземпляр данных List<?> В методе initData(), двух методах с различным временем жизни фрагмента.

Это проблема о жизненном цикле фрагмента

Ответ 6

@Override
public void restoreState(Parcelable state, ClassLoader loader) {}
@Override
public Parcelable saveState() {return null;}
#Add in your adapter after getCount();