Java.lang.IllegalStateException: La aplicación PagerAdapter cambió el contenido del adaptador sin llamar a PagerAdapter # notifyDataSetChanged android
Estoy intentando utilizar una clase estática para pasar el valor a una visión en vez de usar la intención pues tengo que pasar una cantidad grande de datos. A veces consigo este error y no pude averiguar cuál es la razón principal
Error: –
- Android Volley error en getInstance (este) al agregar ImageLoader
- Android MediaPlayer Singleton
- ¿Puede el recolector de basura desasignar una instancia singleton? (Y por qué o cómo evitarlo)
- Singleton en Android
- Ciclo de vida de singleton basado en enum en Android
java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 101, found: 200
Mi clase de buscapersonas
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); } } }
Mi clase estática
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; } }
Cómo llamo a la actividad
Intent intent = new Intent(getActivity(), MemeDetailActivity.class); DataResult.getInstance().setData(mListA);
- ¿Qué hace este método privado en esta clase singleton Java?
- ¿Es necesario guardar singletons?
- Android: Singleton que se utiliza entre Actividad y Servicio
- Ampliación de la clase de aplicación y buenas prácticas
- Ciclo de vida de aplicaciones Android y singelton
- Cómo pasar el contexto de la aplicación dentro Singleton y SharedPreferences Clases
- Android: Mejor manera de guardar los datos almacenados en la clase Application Singleton
- Android: una vs muchas instancias de HttpClient por aplicación
Mira tu código
@Override public int getItemPosition(Object object) { return POSITION_NONE; }
Este código se utiliza para actualizar la vista cuando cambia la vista. También se llama notifyDataSetChanged()
Su método ovverride opcional para que pueda eliminarlo.
Echa un vistazo a esta respuesta: ViewPager PagerAdapter no actualizar la vista
O bien puede cambiar el FragmentStatePagerAdapter
a FragmentPagerAdapter
A veces se produce este error.
Aquí está mi sugerencia:
En su DataResult
-> getData()
Devolver una copia de los datos.
DataResult
es un singleton y contiene los datos. Cuando su vista obtiene los datos, la vista obtiene la referencia de datos que el DataResult
está reteniendo. Entonces setData()
cambiaría la referencia de data
. Aquí viene la IllegalStateException.
Espero que funcione 🙂
Creo que su clase DataResult
no es necesaria.
De acuerdo con tu comentario, obtienes el error mientras actualizas el conjunto de datos. Creo que está recibiendo datos de algunos REST API u otro servicio web. A continuación, asigne los datos que obtiene de la API a una Lista de Arrays temporal y actualice esa lista de arrays temporales mientras recibe nuevos datos. No toque la variable mListA
hasta que termine de recibir los datos. Después de completar la obtención de datos de la API, asigne la lista de arreglos temporales que utilizó para mListA
directamente en una línea.
mListA = tmpList;
Luego vuelve a llamar
mList = mListA; pagerAdapter.notifyDataSetChanged();
Esto debería solucionar su error.
Pruebe a utilizar la siguiente manera:
mList=new ArrayList<Datum>(); mList.addAll(DataResult.getInstance().getData()); DataResult.getInstance().resetData();
- Obtención del campo `ViewDataBinding` de actividad dentro de la prueba de unidad 'Robolectric` después de ser asignado
- Saltar marcadores en Android Maps API v2