私は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;
}
なぜロードに時間がかかるのかわかりません。
コードを最適化するためにできることはたくさんあります。各アイテムの一意のIDとsetHasStableIds(true)を設定することから始めます。 getItemId(int position)をオーバーライドし、ユニークな項目ごとに一意のIDを返します。 – Dexter