0

一些背景资料:FragmentStatePagerAdapter用法与滑翔导致的NullPointerException

我使用FragmentStatePagerAdapter为了实现片段的可变的量的水平滑动视。为了澄清,片段数量取决于一些外部数据。在这种情况下,片段数量可能非常大,因此我无法使用适配器的setOffScreenPageLimit()方法。

现在,这个问题:

我使用滑翔来检索网页中的图像的列表,并在我的片段显示出来。这适用于第一个片段,也是第二个(因为setOffScreenPageLimit()默认为1)。

但是,第三个片段在setOffScreenPageLimit()范围之外。当我尝试在此片段中检索图像时,我从某个在片段上调用getView()的interal Glide方法(显然为null)中得到NullPointerException。我已经确认这实际上是问题所在,例如当我将屏幕外限制设置为4时,例如,当我尝试检索第5个片段上的图像时,应用程序崩溃。

这是我的logcat输出:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.support.v4.app.Fragment.getView()' on a null object reference 
                      at com.bumptech.glide.manager.RequestManagerRetriever.findAllSupportFragmentsWithViews(RequestManagerRetriever.java:189) 
                      at com.bumptech.glide.manager.RequestManagerRetriever.findSupportFragment(RequestManagerRetriever.java:200) 
                      at com.bumptech.glide.manager.RequestManagerRetriever.get(RequestManagerRetriever.java:167) 
                      at com.bumptech.glide.Glide.with(Glide.java:609) 
                      at com.android.miki.quickly.GIFRecyclerAdapter.onViewRecycled(GIFRecyclerAdapter.java:51) 
                      at com.android.miki.quickly.GIFRecyclerAdapter.onViewRecycled(GIFRecyclerAdapter.java:17) 
                      at android.support.v7.widget.RecyclerView$Recycler.dispatchViewRecycled(RecyclerView.java:6056) 
                      at android.support.v7.widget.RecyclerView$Recycler.addViewHolderToRecycledViewPool(RecyclerView.java:5827) 
                      at android.support.v7.widget.RecyclerView$Recycler.recycleViewHolderInternal(RecyclerView.java:5792) 
                      at android.support.v7.widget.RecyclerView$LayoutManager.scrapOrRecycleView(RecyclerView.java:8462) 
                      at android.support.v7.widget.RecyclerView$LayoutManager.detachAndScrapAttachedViews(RecyclerView.java:8447) 
                      at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:563) 
                      at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3583) 
                      at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3312) 
                      at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3844) 
                      at android.view.View.layout(View.java:17637) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5575) 
                      at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741) 
                      at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585) 
                      at android.widget.LinearLayout.onLayout(LinearLayout.java:1494) 
                      at android.view.View.layout(View.java:17637) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5575) 
                      at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079) 
                      at android.view.View.layout(View.java:17637) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5575) 
                      at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1795) 
                      at android.view.View.layout(View.java:17637) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5575) 
                      at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 
                      at android.widget.FrameLayout.onLayout(FrameLayout.java:261) 
                      at android.view.View.layout(View.java:17637) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5575) 
                      at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079) 
                      at android.view.View.layout(View.java:17637) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5575) 
                      at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 
                      at android.widget.FrameLayout.onLayout(FrameLayout.java:261) 
                      at android.view.View.layout(View.java:17637) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5575) 
                      at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741) 
                      at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585) 
                      at android.widget.LinearLayout.onLayout(LinearLayout.java:1494) 
                      at android.view.View.layout(View.java:17637) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5575) 
                      at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 
                      at android.widget.FrameLayout.onLayout(FrameLayout.java:261) 
                      at android.view.View.layout(View.java:17637) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5575) 
                      at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741) 
                      at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585) 
                      at android.widget.LinearLayout.onLayout(LinearLayout.java:1494) 
                      at android.view.View.layout(View.java:17637) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5575) 
                      at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 
                      at android.widget.FrameLayout.onLayout(FrameLayout.java:261) 

以下是GIFRecyclerAdapter类:

public class GIFRecyclerAdapter extends RecyclerView.Adapter<GIFRecyclerAdapter.GifViewHolder>{ 


    private List<String> gifURLs; 

    public GIFRecyclerAdapter(List<String> gifURLs) { 
     this.gifURLs = gifURLs; 
    } 

    @Override 
    public GifViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_gif, parent, false); 
     GifViewHolder vh = new GifViewHolder(v); 
     return vh; 
    } 

    @Override 
    public void onBindViewHolder(GifViewHolder holder, int position) { 
     holder.setGif(gifURLs.get(position)); 
    } 

    @Override 
    public int getItemCount() { 
     return gifURLs.size(); 
    } 

    public void setURLs(List<String> gifURLs) { 
     this.gifURLs = gifURLs; 
    } 

    @Override 
    public void onViewRecycled(GifViewHolder holder){ 
     super.onViewRecycled(holder); 
     Glide.with(holder.itemView).clear(holder.mImageViewGif); 
    } 


    protected class GifViewHolder extends RecyclerView.ViewHolder { 

     private ImageView mImageViewGif; 

     private GifViewHolder(View itemView) { 
      super(itemView); 
      mImageViewGif = (ImageView) itemView.findViewById(R.id.gif_image_view); 
     } 

     private void setGif(String gifURL) { 
      try{ 
       Glide.with(this.itemView).load(gifURL).into(mImageViewGif); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 



} 

谁能给我一些提示,为什么发生这种情况?该片段出现在屏幕上,其余的UI工作正常(可以按下按钮等)。但是,使用Glide加载图像会使应用程序崩溃。我感觉这是某种生命周期细节,与FragmentStatePagerAdapter如何创建和销毁碎片有关,但我不确定。

任何帮助是大大赞赏。

回答

1

我觉得Glide.with(this.itemView)这一行有问题。

刚刚从活动通过上下文适配器,并用它代替this.itemView

另一个快速的解决方法可能是Glide.with(mİmageView.getContext())

好运

埃姆雷

+0

问题是你的观点传递给由于片段生命周期由查看页面控制 –

+0

加载数据时,滑动是无效的啊!它的工作原理!谢谢! –