Stavo affrontando un brutto errore durante l'utilizzo di Viewpager in Recycler View. Sotto l'errore ho affrontato una situazione speciale. Ho iniziato un frammento che aveva un RecyclerView con Viewpager (usando FragmentStatePagerAdapter). Ha funzionato bene fino a quando non sono passato a un frammento diverso facendo clic su una cella in RecyclerView, quindi sono tornato indietro utilizzando il pulsante Indietro dell'hardware del telefono e l'app si è bloccata.
E la cosa divertente di questo era che avevo due Viewpager nello stesso RecyclerView ed entrambi erano a circa 5 celle di distanza (altre non erano visibili sullo schermo, era inattivo). Quindi inizialmente ho appena applicato la soluzione al primo Viewpager e ne ho lasciato l'altro com'è (Viewpager usando i frammenti).
Navigare indietro funzionava bene, quando il pager della prima vista era visualizzabile. Ora, quando sono passato al secondo, poi ho cambiato frammento e sono tornato, si è schiantato (la stessa cosa è successa con il primo). Quindi ho dovuto cambiare entrambi i Viewpager.
Comunque, leggi sotto per trovare una soluzione funzionante. Errore di arresto di seguito:
java.lang.IllegalArgumentException: No view found for id 0x7f0c0098 (com.kk:id/pagerDetailAndTips) for fragment ProductDetailsAndTipsFragment{189bcbce #0 id=0x7f0c0098}
Ho passato ore a debug. Leggi questo post completo della discussione fino in fondo applicando tutte le soluzioni, incluso assicurandoti di passare childFragmentManager.
Niente ha funzionato.
Infine, invece di utilizzare FragmentStatePagerAdapter, ho esteso PagerAdapter e l'ho usato in Viewpager senza usare i frammenti. Credo che ci sia un BUG con frammenti nidificati. Comunque, abbiamo opzioni. Leggere ...
Il link seguente è stato molto utile:
Viewpager senza frammenti
Il collegamento potrebbe interrompersi, quindi sto pubblicando la soluzione implementata qui sotto:
public class ScreenSlidePagerAdapter extends PagerAdapter {
private static final String TAG = "ScreenSlidePager";
ProductDetails productDetails;
ImageView imgProductImage;
ArrayList<Imagelist> imagelists;
Context mContext;
// Constructor
public ScreenSlidePagerAdapter(Context mContext,ProductDetails productDetails) {
//super(fm);
this.mContext = mContext;
this.productDetails = productDetails;
}
// Here is where you inflate your View and instantiate each View and set their values
@Override
public Object instantiateItem(ViewGroup container, int position) {
LayoutInflater inflater = LayoutInflater.from(mContext);
ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.product_image_slide_cell,container,false);
imgProductImage = (ImageView) layout.findViewById(R.id.imgSlidingProductImage);
String url = null;
if (imagelists != null) {
url = imagelists.get(position).getImage();
}
// This is UniversalImageLoader Image downloader method to download and set Image onto Imageview
ImageLoader.getInstance().displayImage(url, imgProductImage, Kk.options);
// Finally add view to Viewgroup. Same as where we return our fragment in FragmentStatePagerAdapter
container.addView(layout);
return layout;
}
// Write as it is. I don't know much about it
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
/*super.destroyItem(container, position, object);*/
}
// Get the count
@Override
public int getCount() {
int size = 0;
if (productDetails != null) {
imagelists = productDetails.getImagelist();
if (imagelists != null) {
size = imagelists.size();
}
}
Log.d(TAG,"Adapter Size = "+size);
return size;
}
// Write as it is. I don't know much about it
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
}
Spero che questo sia stato utile !!