【问题标题】:PagerAdapter crashingPagerAdapter 崩溃
【发布时间】:2017-05-07 07:06:06
【问题描述】:

我有一个用于显示图像幻灯片的 pageradapter,但是当我设置较低的屏幕外限制时它会崩溃。

这是我的代码

public class ProjectPicturesAdapter extends PagerAdapter {

private List<String> pictures;
private LayoutInflater inflater;
private final RequestManager glide;

public ProjectPicturesAdapter(RequestManager glide, LayoutInflater inflater, List<String> pictures) {
    this.pictures = pictures;
    this.glide = glide;
    this.inflater = inflater;
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
    View image = inflater.inflate(R.layout.slider_image, container, false);
    ImageView myImage = (ImageView) image.findViewById(R.id.image);

    glide.load(pictures.get(position))
            .centerCrop()
            .crossFade()
            .placeholder(R.drawable.project_placeholder)
            .into(myImage);
    container.addView(myImage);
    return myImage;
}

@Override
public void destroyItem(ViewGroup container, int position, Object view) {
    container.removeView((View) view);
}


@Override
public int getCount() {
    return pictures.size();
}

@Override
public boolean isViewFromObject(View view, Object object) {
    return view.equals(object);
}

}

我初始化适配器的方式是这样的

      ProjectPicturesAdapter picturesAdapter = new 
       ProjectPicturesAdapter(Glide.with(this), LayoutInflater.from(this), 
      images);

        ViewPager pager = (ViewPager) findViewById(R.id.viewPager);
        pager.setAdapter(picturesAdapter);
        pager.setOffscreenPageLimit(1);

如果有超过 2 张图片就会崩溃,我可以随时增加离屏限制,但是如果有 20 张图片会发生什么,我无法将离屏限制保持为 20。

我的崩溃日志给出了一个错误,说指定的孩子已经有一个父母。您必须先在孩子的父母上调用 removeView()。

【问题讨论】:

  • 使用 FragmentStatePagerAdapter 并尝试。

标签: android android-viewpager layout-inflater android-pageradapter


【解决方案1】:

更新ProjectPicturesAdapter如下:

public class ProjectPicturesAdapter extends PagerAdapter {

private List<String> pictures;
private LayoutInflater inflater;
private final RequestManager glide;

public ProjectPicturesAdapter(RequestManager glide, LayoutInflater inflater, List<String> pictures) {
    this.pictures = pictures;
    this.glide = glide;
    this.inflater = inflater;
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
    ViewGroup view = (ViewGroup) inflater.inflate(R.layout.slider_image, container, false);
    ImageView myImage = (ImageView) view.findViewById(R.id.image);

    glide.load(pictures.get(position))
            .centerCrop()
            .crossFade()
            .placeholder(R.drawable.project_placeholder)
            .into(myImage);

    container.addView(view);

    return view;
}

@Override
public void destroyItem(ViewGroup container, int position, Object view) {
    container.removeView((View) view);
}

@Override
public int getCount() {
    return pictures.size();
}

@Override
public boolean isViewFromObject(View view, Object object) {
    return view == object;
}

}

【讨论】:

    【解决方案2】:

    如果您的目标是展示轮播? 只要使用这个库,你的问题就会解决https://github.com/sayyam/carouselview

    【讨论】:

      【解决方案3】:

      问题是由这个引起的:

      @Override
      public void destroyItem(ViewGroup container, int position, Object view) 
      {
          container.removeView((View) view);
      }
      

      我建议使用 FragmentStatePagerAdapter 而不是 PagerAdapter。

      public static class MyAdapter extends FragmentStatePagerAdapter {
          public MyAdapter(FragmentManager fm) {
              super(fm);
          }
      
          @Override
          public int getCount() {
              return NUM_ITEMS;
          }
      
          @Override
          public Fragment getItem(int position) {
              return ArrayListFragment.newInstance(position);
          }
      }
      

      mAdapter = new MyAdapter(getFragmentManager());
      
      mPager = (ViewPager)findViewById(R.id.pager);
      mPager.setAdapter(mAdapter);
      

      【讨论】:

      • 但是我这里不需要显示片段,我只有一个图像视图布局
      猜你喜欢
      • 2022-11-02
      • 1970-01-01
      • 2011-11-22
      • 2021-05-14
      • 1970-01-01
      • 2017-09-13
      • 2016-11-09
      • 2018-12-11
      • 2013-05-30
      相关资源
      最近更新 更多