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);
}
});
}
pouvez-vous poster le code MyViewHolder? – GuilhE
@GuilhE Code MyViewHolder ajouté. – user1590595