0

我的應用程序的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); 
     } 
    }); 
} 
+0

你可以發佈MyViewHolder代碼嗎? – GuilhE

+0

已添加@GuilhE MyViewHolder代碼。 – user1590595

回答

0

嘗試使用而不是存儲HTE完整圖像默認caching strategy for glideDiskCacheStrategy.RESULT),其存儲在高速緩存中得到的圖像,。 通過這樣做,您可以減少應用於圖像的轉換量(處理更少 - >丟失幀的機會更少)。

+0

我的發現是佈局充氣器是這裏的瓶頸。你不覺得嗎?或者它一定是滑翔? – user1590595

+0

滑動在填充視圖時正在使用,因此可能會產生一些影響。嘗試先用所有默認選項滑動,然後告訴我它是否有所作爲。另外,看到您的實際佈局文件將會很好。 – Logain

+0

我刪除了Glide,但仍然存在。任何其他建議?佈局文件是正常的6視圖。早些時候,它與ListView工作正常。 – user1590595

相關問題