Bei der Verwendung von Viewpager in Recycler View ist ein böser Fehler aufgetreten. Unter Fehler stand ich in einer besonderen Situation. Ich habe ein Fragment gestartet, das eine RecyclerView mit Viewpager hatte (mit FragmentStatePagerAdapter). Es funktionierte gut, bis ich beim Klicken auf eine Zelle in RecyclerView zu einem anderen Fragment wechselte und dann mit der Hardware-Schaltfläche "Zurück" des Telefons zurück navigierte und die App abstürzte.
Und das Lustige daran war, dass ich zwei Viewpager in derselben RecyclerView hatte und beide ungefähr 5 Zellen entfernt waren (andere waren auf dem Bildschirm nicht sichtbar, sie waren ausgefallen). Also habe ich die Lösung zunächst nur auf den ersten Viewpager angewendet und den anderen so belassen, wie er ist (Viewpager mit Fragmenten).
Das Zurücknavigieren funktionierte einwandfrei, als der Pager für die erste Ansicht sichtbar war. Als ich jetzt zum zweiten gescrollt habe und dann das Fragment gewechselt habe und zurückgekommen bin, ist es abgestürzt (dasselbe ist mit dem ersten passiert). Also musste ich beide Viewpager wechseln.
Wie auch immer, lesen Sie unten, um eine funktionierende Lösung zu finden. Absturzfehler unten:
java.lang.IllegalArgumentException: No view found for id 0x7f0c0098 (com.kk:id/pagerDetailAndTips) for fragment ProductDetailsAndTipsFragment{189bcbce #0 id=0x7f0c0098}
Verbrachte Stunden damit, es zu debuggen. Lesen Sie diesen vollständigen Thread-Beitrag bis zum Ende und wenden Sie alle Lösungen an, einschließlich der Sicherstellung, dass ich childFragmentManager übergebe.
Nichts hat geklappt.
Anstatt FragmentStatePagerAdapter zu verwenden, habe ich PagerAdapter erweitert und in Viewpager verwendet, ohne Fragmente zu verwenden. Ich glaube einige, wo es einen BUG mit verschachtelten Fragmenten gibt. Wie auch immer, wir haben Optionen. Lesen ...
Der folgende Link war sehr hilfreich:
Viewpager ohne Fragmente
Der Link kann sterben, daher veröffentliche ich meine implementierte Lösung hier unten:
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;
}
}}
Hoffe das war hilfreich !!