0

に私のアプリのMainActivityクラスを使用しながら、カスタムRecyclerViewアダプタが重いラグを発生させるには、約10のタブでViewPagerで構成されています。各タブの中で、私はListItemをアンドロイドRecyclerViewを使ってロードしています。この問題は、ユーザーがViewPagerの右端をスワイプするときに発生します。デバッグ後、私は問題が私のCustomListAdapter内で発生することを発見しました。viewpager

私はonCreateViewHolder内部レイアウトの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メソッドの外に移動する方法はありますか?

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)を、使用してみてください。 は、これを行うことにより、あなたはあなたのイメージ( - >コマ落ちの少ないチャンス少ない処理)にaplied変換の量を減らします。

+0

私の知るところは、レイアウトインフレータがここでのボトルネックです。あなたはそれを考えませんか?それともグライドでなければなりませんか? – user1590595

+0

ビューにデータを入力するときにグライドが使用されているため、おそらく影響があります。最初にすべてのデフォルトオプションでグライドを試してみて、違いがあるかどうか教えてください。また、実際のレイアウトファイルを見るのもいいでしょう。 – Logain

+0

私はGlideを取り外しましたが、まだ遅れがあります。他の提案はありますか?レイアウトファイルは6ビューで通常です。以前はListViewでうまくいきました。 – user1590595