在 Recycler View 中使用 Viewpager 时,我遇到了一个令人讨厌的错误。下面是我在特殊情况下遇到的错误。我开始了一个片段,它有一个带有 Viewpager 的 RecyclerView(使用 FragmentStatePagerAdapter)。它运行良好,直到我在 RecyclerView 中单击单元格时切换到不同的片段,然后使用手机的硬件后退按钮导航回来,应用程序崩溃了。
有趣的是,我在同一个 RecyclerView 中有两个 Viewpager,并且两个 Viewpager 都相距大约 5 个单元格(其他在屏幕上不可见,它已关闭)。所以最初我只是将解决方案应用于第一个 Viewpager 并保留另一个原样(Viewpager using Fragments)。
当第一个视图寻呼机可见时,向后导航工作正常。现在,当我向下滚动到第二个然后更改片段并返回时,它崩溃了(第一个也发生了同样的事情)。所以我不得不改变两个Viewpagers。
无论如何,请阅读以下内容以找到可行的解决方案。崩溃错误如下:
java.lang.IllegalArgumentException: No view found for id 0x7f0c0098 (com.kk:id/pagerDetailAndTips) for fragment ProductDetailsAndTipsFragment{189bcbce #0 id=0x7f0c0098}
花了几个小时调试它。阅读这篇完整的 Thread 帖子直到底部应用所有解决方案,包括确保我正在传递 childFragmentManager。
没有任何效果。
最后,我没有使用 FragmentStatePagerAdapter ,而是扩展了 PagerAdapter 并在 Viewpager 中使用它而不使用片段。我相信有些地方有嵌套片段的BUG。无论如何,我们有选择。读 ...
下面的链接非常有帮助:
没有片段的 Viewpager
链接可能会死,所以我在下面发布我实施的解决方案:
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;
}
}
希望这有帮助!