Come forzare ViewPager a creare nuovamente un'istanza dei suoi elementi [duplicato]
-
28-10-2019 - |
Domanda
Questa domanda ha già una risposta qui:
- ViewPager PagerAdapter non aggiorna la vista 39 risposte
Sto utilizzando ViewPager
per consentire all'utente di scorrere tra le sue visualizzazioni.C'è un modo per forzare questo ViewPager
per ricaricare / reistanziare le sue visualizzazioni nel caso in cui non siano più valide o debbano essere aggiornate?Ho provato a chiamare notifyDataSetChanged()
sul suo adattatore ma questo non richiama nuovamente il metodo instantiateItem()
.
MODIFICA
Ecco la classe che si estende da ViewPager e la sua definizione dell'adattatore.Di seguito è riportato il metodo refresh()
che chiamo quando voglio forzare l'aggiornamento degli elementi.
public class DayFlipper extends ViewPager {
public class FlipperAdapter extends PagerAdapter {
@Override
public int getCount() {
return DayFlipper.DAY_HISTORY;
}
@Override
public void startUpdate(View container) {
}
@Override
public Object instantiateItem(View container, int position) {
Log.d(TAG, "instantiateItem(): " + position);
Date d = DateHelper.getBot();
for (int i = 0; i < position; i++) {
d = DateHelper.getTomorrow(d);
}
d = DateHelper.normalize(d);
CubbiesView cv = new CubbiesView(mContext);
cv.setLifeDate(d);
((ViewPager) container).addView(cv, 0);
// add map
cv.setCubbieMap(mMap);
cv.initEntries(d);
return cv;
}
@Override
public void destroyItem(View container, int position, Object object) {
((ViewPager) container).removeView((CubbiesView) object);
}
@Override
public void finishUpdate(View container) {
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == ((CubbiesView) object);
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void restoreState(Parcelable state, ClassLoader loader) {
}
}
...
public void refresh() {
getAdapter().notifyDataSetChanged();
}
}
Soluzione 2
Ho trovato una soluzione.È solo una soluzione alternativa al mio problema, ma attualmente l'unica soluzione.
ViewPager PagerAdapter non aggiorna la vista
public int getItemPosition(Object object) {
return POSITION_NONE;
}
Qualcuno sa se si tratta di un bug o no?
Altri suggerimenti
Ha avuto lo stesso problema.Per me ha funzionato chiamare
viewPage.setAdapter( adapter );
di nuovo che ha causato di nuovo la creazione di istanze delle pagine.
public class DayFlipper extends ViewPager {
private Flipperadapter adapter;
public class FlipperAdapter extends PagerAdapter {
@Override
public int getCount() {
return DayFlipper.DAY_HISTORY;
}
@Override
public void startUpdate(View container) {
}
@Override
public Object instantiateItem(View container, int position) {
Log.d(TAG, "instantiateItem(): " + position);
Date d = DateHelper.getBot();
for (int i = 0; i < position; i++) {
d = DateHelper.getTomorrow(d);
}
d = DateHelper.normalize(d);
CubbiesView cv = new CubbiesView(mContext);
cv.setLifeDate(d);
((ViewPager) container).addView(cv, 0);
// add map
cv.setCubbieMap(mMap);
cv.initEntries(d);
adpter = FlipperAdapter.this;
return cv;
}
@Override
public void destroyItem(View container, int position, Object object) {
((ViewPager) container).removeView((CubbiesView) object);
}
@Override
public void finishUpdate(View container) {
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == ((CubbiesView) object);
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void restoreState(Parcelable state, ClassLoader loader) {
}
}
...
public void refresh() {
adapter().notifyDataSetChanged();
}
}
prova questo.