0

J'ai un pageradapter que j'utilise pour afficher un diaporama d'images mais il se bloque lorsque je définis une limite d'écran inférieure.PagerAdapter plantant

Voici mon code

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); 
} 

} 

La façon dont je suis l'initialisation de l'adaptateur est ce

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

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

S'il y a plus de 2 images puis il se bloque, je pourrais toujours augmenter la limite hors écran mais que se passe-t-il s'il y a 20 images, je ne peux pas garder la limite hors écran comme 20.

Mon journal de panne donne une erreur indiquant que l'enfant spécifié a déjà un parent. Vous devez d'abord appeler removeView() sur le parent de l'enfant.

+0

Utilisez FragmentStatePagerAdapter et essayer. –

Répondre

1

Mise à jour ProjectPicturesAdapter comme ci-dessous:

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; 
} 

} 
0

Le problème est causé par ceci:

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

Je recommande d'utiliser FragmentStatePagerAdapter au lieu de 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); 
+0

Mais je n'ai pas besoin d'afficher des fragments ici, je n'ai qu'une seule vue d'affichage d'image –