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);
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 :)
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
essayez d'utiliser la méthode suivante:
mList=new ArrayList<Datum>();
mList.addAll(DataResult.getInstance().getData());
DataResult.getInstance().resetData();
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
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.