it-swarm.com.de

Java.lang.IllegalStateException: Die Anwendung PagerAdapter hat den Inhalt des Adapters geändert, ohne den PagerAdapter # notifyDataSetChanged android aufzurufen

Ich versuche, eine statische Klasse zu verwenden, um einen Wert an eine Ansicht zu übergeben, anstatt Absicht zu verwenden, da ich eine große Datenmenge übergeben muss. Manchmal erhalte ich diesen Fehler und konnte nicht herausfinden, was der Hauptgrund ist

Error :-

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

Meine Pager-Klasse

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

}

Meine statische Klasse

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

Wie nenne ich die Tätigkeit?

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

Manchmal tritt dieser Fehler auf.

Hier ist mein Vorschlag:

In Ihrer DataResult-> getData()

eine Kopie der Daten zurücksenden.

DataResult ist ein Singleton und enthält die Daten. Wenn Ihre Ansicht die Daten abruft, erhält die Ansicht die Datenreferenz, die die DataResult enthält. Dann würde setData() die data-Referenz ändern. Hier kommt die IllegalStateException.

Hoffe es würde klappen :)

1
Rust Fisher

Es kann sein, dass Sie zuerst setAdapter() und notifyDataSetChanged in der Methode initUI()

Dann instanziieren Sie die List<?>-Daten in der Methode initData(), den beiden Methoden mit unterschiedlicher Lebensdauer des Fragments. 

Es ist das Problem des Fragment-Lebenszyklus

0
chen hang

versuchen Sie es auf folgende Weise:

mList=new ArrayList<Datum>();
        mList.addAll(DataResult.getInstance().getData());
        DataResult.getInstance().resetData();
0
Anuj J Pandey
@Override
public void restoreState(Parcelable state, ClassLoader loader) {}
@Override
public Parcelable saveState() {return null;}
#Add in your adapter after getCount();
0

schau dir deinen Code an:

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

dieser Code wird verwendet, um die Ansicht zu aktualisieren, wenn sich die Ansicht ändert. es wird auch notifyDataSetChanged() genannt

seine optionale Überlaufmethode, damit Sie sie entfernen können.

Sehen Sie sich diese Antwort an: ViewPager PagerAdapter aktualisiert die Ansicht nicht

oder Sie können die FragmentStatePagerAdapter in FragmentPagerAdapter ändern.

0
Sagar Chavada

Ich denke, Ihre DataResult-Klasse ist nicht notwendig.

Ihrem Kommentar zufolge erhalten Sie den Fehler, während Sie den Datensatz aktualisieren. Ich denke, Sie erhalten Daten von einer REST API oder einem anderen Webdienst. Weisen Sie dann die Daten, die Sie von der API erhalten, einer temporären Array-Liste zu und aktualisieren Sie diese temporäre Array-Liste, während Sie neue Daten abrufen. Berühren Sie die Variable mListA nicht, bis Sie keine Daten mehr empfangen. Nachdem Sie die Daten von der API abgerufen haben, weisen Sie die temporäre Array-Liste, die Sie verwendet haben, direkt mListA in einer Zeile zu.

mListA = tmpList;

Dann nochmal anrufen

mList = mListA;
pagerAdapter.notifyDataSetChanged();

Dies sollte Ihren Fehler beheben. 

0
Dulaj Atapattu