J'étais confronté à une erreur Nasty lors de l'utilisation de Viewpager dans Recycler View. Ci-dessous l'erreur que j'ai rencontrée dans une situation particulière. J'ai commencé un fragment qui avait un RecyclerView avec Viewpager (en utilisant FragmentStatePagerAdapter). Cela a bien fonctionné jusqu'à ce que je passe à un fragment différent en cliquant sur une cellule dans RecyclerView, puis que je retourne en utilisant le bouton Retour du téléphone et l'application se bloque.
Et ce qui est drôle à ce sujet, c'est que j'avais deux Viewpagers dans le même RecyclerView et que les deux étaient à environ 5 cellules (l'autre n'était pas visible à l'écran, il était en panne). Donc, au départ, j'ai simplement appliqué la solution au premier Viewpager et laissé l'autre tel quel (Viewpager utilisant des fragments).
La navigation en arrière a bien fonctionné, lorsque le premier téléavertisseur était visible. Maintenant, quand je suis descendu vers le second, puis que j'ai changé de fragment et que je suis revenu, il s'est écrasé (la même chose s'est produite avec le premier). J'ai donc dû changer les deux Viewpagers.
Quoi qu'il en soit, lisez ci-dessous pour trouver une solution de travail. Erreur de plantage ci-dessous:
java.lang.IllegalArgumentException: No view found for id 0x7f0c0098 (com.kk:id/pagerDetailAndTips) for fragment ProductDetailsAndTipsFragment{189bcbce #0 id=0x7f0c0098}
J'ai passé des heures à le déboguer. Lisez cet article de discussion complet jusqu'au bas en appliquant toutes les solutions, y compris en vous assurant que je passe childFragmentManager.
Rien n'a fonctionné.
Enfin, au lieu d'utiliser FragmentStatePagerAdapter, j'ai étendu PagerAdapter et l'ai utilisé dans Viewpager sans utiliser de fragments. Je crois que certains où il y a un BUG avec des fragments imbriqués. Quoi qu'il en soit, nous avons des options. Lis ...
Le lien ci-dessous a été très utile:
Viewpager sans fragments
Le lien peut mourir, je publie ma solution implémentée ci-dessous:
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;
}
}
J'espère que cela a été utile !!