0

La classe MainActivity de mon application comprend ViewPager avec environ 10 onglets. À l'intérieur de chaque onglet, je charge ListItem en utilisant android RecyclerView. Le problème se produit lorsque l'utilisateur effectue un balayage à droite-gauche dans ViewPager. Après le débogage, j'ai trouvé ce problème se produit dans mon CustomListAdapter.Adaptateur RecyclerView personnalisé générant un décalage important lors de l'utilisation dans viewpager

J'ai trouvé que les retards augmentent si j'augmente le nombre de Layout Inflater à l'intérieur de CreateViewHolder.

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    RecyclerView.ViewHolder viewHolder; 

    // performance hit 
    View itemView = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.list_row, parent, false); 
    View itemViewlast = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.list_row_last, parent, false); 
    View itemViewdefault = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.list_row_default, parent, false); 

    switch (viewType) { 
     case 0: 
      viewHolder = new MyViewHolder(itemView); 
      break; 
     case 3: 
      viewHolder = new MyViewHolder(itemViewlast); 
      break; 
     default: 
      viewHolder = new MyViewHolder(itemView1); 
      break; 
    } 

    return viewHolder; 
} 

Pour réduire cela, j'ai déplacé LayoutInflater à l'intérieur de l'interrupteur lui-même.

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    RecyclerView.ViewHolder viewHolder; 

    switch (viewType) { 
     case 0: 
      // moved here 
      View itemView = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.list_row, parent, false); 
      viewHolder = new MyViewHolder(itemView); 
      break; 
     case 3: 
      // moved here 
      View itemViewlast = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.list_row_last, parent, false); 
      viewHolder = new MyViewHolder(itemViewlast); 
      break; 
     default: 
      // moved here 
      View itemViewdefault = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.list_row_default, parent, false); 
      viewHolder = new MyViewHolder(itemView1); 
      break; 
    } 

    return viewHolder; 
} 

Maintenant, j'ai toujours l'impression qu'il reste un peu de décalage. Donc ma question est, Y at-il un moyen de réduire ce retard ou déplacer Inflater Layout en dehors de la méthode onCreateViewHolder?

MyViewHolder Méthode:

public class MyViewHolder extends RecyclerView.ViewHolder { 
     public TextView title, rating, genre,detailmovie,movieName,movieTime; 
     public ImageView thumbNail, movieNail; 
     public MyViewHolder(View view) { 
      super(view); 
      title = (TextView) view.findViewById(R.id.title); 
      rating = (TextView) view.findViewById(R.id.rating); 
      genre = (TextView) view.findViewById(R.id.genre); 
      detailmovie = (TextView) view.findViewById(R.id.detailmovie); 
      movieName = (TextView) view.findViewById(R.id.movieName); 
      movieTime = (TextView) view.findViewById(R.id.movieTime); 
      thumbNail = (ImageView) view.findViewById(R.id.thumbnail); 
      movieNail = (ImageView) view.findViewById(R.id.movieThumbnail); 
     } 
    } 

@Override 
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { 

     switch (viewHolder.getItemViewType()) { 
      case 0: 
       MyViewHolder vh1 = (MyViewHolder) viewHolder; 
       configureViewHolder1(vh1, position); 
       break; 
      case 3: 
       MyViewHolder vh3 = (MyViewHolder) viewHolder; 
       configureViewHolder1(vh3, position); 
       break; 
      default: 
       MyViewHolder vh4 = (MyViewHolder) viewHolder; 
       configureViewHolder1(vh4, position); 
       break; 
     } 
    } 

private void configureViewHolder1(MyViewHolder vh1, int position) { 

    final Movie movie = movieItems.get(position); 

    vh1.title.setText(movie.getTitle()); 
    vh1.rating.setText("Rating: " + String.valueOf(movie.getRating())); 

    Glide.with(activity). 
     load(Uri.parse(movie.getThumbnailUrl())). 
     crossFade(). 
     placeholder(R.drawable.placeholder).diskCacheStrategy(DiskCacheStrategy.SOURCE). 
     dontTransform(). 
     into(vh1.thumbNail); 

    vh1.movieDetail.setText(String.valueOf(movie.movieDetail())); 
    vh1.movieName.setText(String.valueOf(movie.getmovieName())); 
    vh1.movieTime.setText(String.valueOf(movie.getmovieTime())); 

    vh1.itemView.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View view) { 
      fragmentJump(movie); 
     } 
    }); 
} 
+0

pouvez-vous poster le code MyViewHolder? – GuilhE

+0

@GuilhE Code MyViewHolder ajouté. – user1590595

Répondre

0

Essayez d'utiliser par défaut caching strategy for glide (DiskCacheStrategy.RESULT), qui stocke l'image résultante sur le cache, au lieu de stocker l'image hte complète. En faisant cela, vous réduisez le nombre de transformations appliquées à vos images (moins de traitement -> moins de chances d'abandonner les images).

+0

Ma découverte était Layout Inflator est le goulot d'étranglement ici. Tu ne penses pas ça? Ou ça doit être Glide? – user1590595

+0

Glide est utilisé lors du remplissage de la vue, il est donc probablement avoir un impact. Essayez d'utiliser le glissement avec toutes les options par défaut et dites-moi si cela a fait une différence. En outre, ce serait bien de voir votre fichier de mise en page réel. – Logain

+0

J'ai enlevé le glissement mais le décalage est toujours présent. Toute autre suggestion? Le fichier de mise en page est normal avec 6 vues. Auparavant, cela fonctionnait bien avec ListView. – user1590595