2016-05-25 3 views
3

Я создаю ресайлер для 500 элементов. Он вызывает onCreateViewHolder и onBindViewHolder для каждого элемента и слишком долго загружается. Из-за этого пользовательский интерфейс пропустил около 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

есть много вещей, которые вы можете сделать для оптимизации вашего кода. Начните с установки уникального идентификатора для каждого элемента и setHasStableIds (true). Переопределите getItemId (int position) и верните уникальный идентификатор для каждого уникального элемента. – Dexter

ответ

4

Я использовал RecyclerView внутри ScrollView, который заставлял его загружаться как улитка. Просто удалил scrollview, и все работает как шарм.

1

Имхо у вас есть несколько вариантов:

  • постраничного список - нагрузить, например, первые 50 элементов, когда пользователь достигает дна, нагрузка еще 50 ... (как предложено here)
  • начать с пустого списка и индикатора выполнения. Затем залейте массив (например, постепенно) из фонового потока и вызовите notifyDataSetChanged() после каждого обновления.

Второй вариант может быть жизнеспособным, если набор данных фиксирован/известен (например, в вашем случае имеется список песен).

+0

Да, второй вариант хорош. Но я думаю, что просмотр ресайклеров всего за 500 позиций не должен быть медленным. Поэтому я пытаюсь выяснить, есть ли проблемы. Я сделаю второй вариант, если все остальное не получится – crysis

Смежные вопросы