2016-05-25 27 views
3

私は500アイテムのリサイクラビューを作成しています。すべてのアイテムに対してonCreateViewHolderとonBindViewHolderが呼び出されており、ロードに時間がかかりすぎます。このため、UIは約522フレームをスキップしました。どうすればそれをより速くロードすることができますか?RecyclerViewの読み込みに時間がかかります

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     if(holder.getItemViewType() == SHUFFLE_ROW) { 
      Log.d(TAG, "Position " + position); 
      if(searchClicked) { 
        final SearchBoxHolder searchHolder = (SearchBoxHolder) holder; 
        searchHolder.backIcon.setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
         } 
       } 
       else { 
        ShuffleAllViewHolder shuffleHolder = (ShuffleAllViewHolder) holder; 
        shuffleHolder.numOfSongs.setText(mSongList.size() + " Songs"); 
       } 


      } 
else if(holder.getItemViewType() == SONG_ROW) { 
       ListViewHolder listViewHolder = (ListViewHolder) holder; 
       Song currentSong = mSongList.get(position-1); 
       listViewHolder.albumTitle.setText(currentSong.getTitle()); 
       listViewHolder.albumArtist.setText(currentSong.getArtist()); 
       Picasso.with(mContext).load(currentSong.getAlbumArt()).placeholder(R.drawable.placeholder) 
         .resize(70, 70) 
         .centerCrop() 
         .into(listViewHolder.albumImage); 
      } 
} 

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
if(viewType == SHUFFLE_ROW) { 
       if(searchClicked) { 
        view = LayoutInflater.from(parent.getContext()).inflate(R.layout.search_row, parent, false); 

        return new SearchBoxHolder(view); 
       } 
       else { 
        view = LayoutInflater.from(parent.getContext()).inflate(R.layout.shuffle_all_row, parent, false); 

        return new ShuffleAllViewHolder(view); 
       } 
      } 
      else { 
       view = LayoutInflater.from(parent.getContext()).inflate(R.layout.song_row, parent, 
         false); 
       return new ListViewHolder(view); 
      } 


    public int getItemViewType(int position) { 
     if(position == 0) { 
      return SHUFFLE_ROW; 
     } 
     else return SONG_ROW; 
    } 

なぜロードに時間がかかるのかわかりません。

+0

コードを最適化するためにできることはたくさんあります。各アイテムの一意のIDとsetHasStableIds(true)を設定することから始めます。 getItemId(int position)をオーバーライドし、ユニークな項目ごとに一意のIDを返します。 – Dexter

答えて

4

RecyclerViewScrollViewの中には、カタツムリのような負荷がかかっていました。スクロールビューを削除するだけで、すべてが魅力のように機能します。

1

あなたはオプションのカップルを持って私見:

  • は、リストをページ分割 - 例えばロード最初の50項目、ユーザーが下部に到達すると、さらに50をロード...(推奨hereなど)
  • 空のリストと進行状況バーから始めます。その後、バックグラウンドスレッドからアレイを(例えば、徐々に)配置し、各更新の後にnotifyDataSetChanged()を呼び出します。

データセットが固定/既知の場合(曲のリストを持つケースのように)、2番目のオプションが有効です。

+0

ええ、第2の選択肢は良いです。しかし、私は、わずか500アイテムのリサイクル・ビューは遅くならないと思う。だから私は問題があるかどうかを調べようとしています。他のすべてが失敗した場合は2番目のオプションを実行します – crysis

関連する問題