我的應用程序的MainActivity類由大約10個選項卡組成的ViewPager組成。在每個標籤中,我使用Android RecyclerView加載ListItem。用戶在ViewPager中左右滑動時發生問題。調試後,我發現問題發生在我的CustomListAdapter中。自定義RecyclerView適配器在viewpager中使用時產生嚴重延遲
我發現,如果我增加了onCreateViewHolder中的Layout Inflater數量,延遲增加了。
@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;
}
爲了減少我在開關櫃本身內部移動LayoutInflater。
@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;
}
現在我仍然覺得還有一些滯後。所以我的問題是,有沒有辦法減少onCreateViewHolder方法之外的滯後或移位佈局Inflater?
MyViewHolder方法:
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);
}
});
}
你可以發佈MyViewHolder代碼嗎? – GuilhE
已添加@GuilhE MyViewHolder代碼。 – user1590595