web-dev-qa-db-fra.com

Java.lang.IllegalStateException: l'application PagerAdapter a modifié le contenu de l'adaptateur sans appeler PagerAdapter # notifyDataSetChanged android

J'essaie d'utiliser une classe statique pour transmettre de la valeur à une vue au lieu d'utiliser l'intention, car je dois transmettre une grande quantité de données. Parfois, j'obtiens cette erreur et n'arrive pas à savoir quelle est la raison principale

Erreur :-

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

Mon cours de téléavertisseur

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

}

Ma classe statique

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

Comment j'appelle l'activité

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

Parfois, cette erreur se produit.

Voici ma suggestion:

Dans votre DataResult-> getData()

renvoyer une copie des données.

DataResult est un singleton et contient les données. Lorsque votre vue obtient les données, elle obtient la référence de données que contient la variable DataResult. Alors setData() changerait la référence data. Voici l'IllegalStateException.

J'espère que ça marcherait :)

1
Rust Fisher

Peut-être parce que vous avez d'abord setAdapter() et notifyDataSetChanged dans la méthode initUI()

Ensuite, vous instanciez les données List<?> dans la méthode initData(), les deux méthodes ayant une durée de vie de fragment différente. 

C'est le problème du cycle de vie de fragment

0
chen hang

essayez d'utiliser la méthode suivante:

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

regardez votre code:

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

ce code est utilisé pour actualiser la vue lorsque celle-ci change. on l'appelle aussi notifyDataSetChanged()

sa méthode optionnelle ovverride afin que vous puissiez la supprimer.

Jetez un oeil à cette réponse: ViewPager PagerAdapter ne met pas à jour la vue

ou bien vous pouvez changer la FragmentStatePagerAdapter en FragmentPagerAdapter

0
Sagar Chavada

Je pense que votre classe DataResult n'est pas nécessaire.

Selon votre commentaire, vous obtenez une erreur lors de la mise à jour du jeu de données. Je pense que vous obtenez des données à partir d'une API REST ou d'un autre service Web. Affectez ensuite les données que vous obtenez de l'API à une liste de matrices temporaire et mettez à jour cette liste de matrices temporaire lorsque vous obtenez de nouvelles données. Ne touchez pas la variable mListA jusqu'à ce que vous ayez fini de recevoir les données. Une fois que vous avez obtenu les données de l'API, affectez la liste de tableaux temporaire que vous avez utilisée à mListA directement sur une ligne.

mListA = tmpList;

Puis encore appeler

mList = mListA;
pagerAdapter.notifyDataSetChanged();

Cela devrait résoudre votre erreur. 

0
Dulaj Atapattu