2015-07-19 4 views
1

Я пытаюсь создать RecyclerView с множеством модулей в сетке, некоторые из которых содержат списки дочерних элементов. Как добавить эти дочерние списки, не вызывая заикания при прокрутке пользователя?Как я могу добавить дочерние списки внутри элементов RecyclerView эффективно, например, в приложении Google Keep?

Я попытался добавление LinearLayout к моим ViewHolder и раздуванию мнения ребенка вручную в onBindViewHolder, а также с использованием вложенных RecyclerViews. Оба имеют проблемы с производительностью, а вложенные RecyclerViews имеют дополнительную проблему, заключающуюся в том, что wrap_content не играет хорошо.

Любые предложения по оптимизации производительности? Я пропустил лучший способ?

@Override 
public int getItemViewType(int position) { 
    return modules.get(position).getType().ordinal(); 
} 

@Override 
public ModuleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    switch (types[viewType]) { 
     case LINEARLAYOUTSTATBLOCK: 
      return new ModuleLLBlockViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.module_block, parent, false)); 
     case RECYCLERVIEWSTATBLOCK: 
      return new ModuleRVBlockViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.module_block, parent, false)); 
    } 
} 

@Override 
public void onBindViewHolder(ModuleViewHolder vh, final int position) { 
    switch (types[vh.getItemViewType()]) { 
     case LINEARLAYOUTSTATBLOCK: 
      bind((ModuleLLBlockViewHolder) vh, (StatBlockModule) modules.get(position)); 
      break; 
     case RECYCLERVIEWSTATBLOCK: 
      bind((ModuleRVBlockViewHolder) vh, (StatBlockModule) modules.get(position)); 
      break; 
    } 
} 

private void bind(ModuleLLBlockViewHolder vh, TitleTextBlockModule module) { 
    for (int i = 0; i < module.getStats().size(); i++) { 
     View v = LayoutInflater.from(vh.linearLayout.getContext()).inflate(R.layout.row, vh.linearLayout, true); 
     v.setId(i); 
     TextView tvCategory = (TextView) v.findViewById(R.id.tvCategory); 
     CustomView customView = (CustomView) v.findViewById(R.id.customView); 
     tvCategory.setText(stat.getCategory()); 
     customView.setRating(stat.getRating()); 
    } 
} 

private void bind(ModuleRVBlockViewHolder vh, StatBlockModule module) { 
    vh.childRecyclerView.setLayoutManager(new LinearLayoutManager(vh.itemView.getContext())); 
    vh.childRecyclerView.setAdapter(new ChildAdapter(module.getStats())); 
} 

Google Keep example

+1

Хороший вопрос. В настоящее время я пытаюсь сделать то же самое. Если я это выясню, я отправлю ответ. –

+0

Любое обновление по этому вопросу? Я успешно реализовал дочерний элемент RecyclerView внутри элемента своего родителя, и он работает, но с плохими характеристиками. даже попытался сделать это лучше: https://medium.com/@p.tournaris/recyclerview-how-we- достиг-60-FPS-советы-в-workables-андроид-приложение-recyclerviews-c646c796473C# .6elg95wbi – rexxar

ответ

0

С Android Support Library 23.2, RecyclerView в настоящее время подчиняется wrap_content, поэтому он может быть использован внутри элемента списка.

Вы должны установить android:nestedScrollingEnabled="false" на внутреннем RecyclerView (ых), чтобы прокрутка обрабатывалась только внешним RecyclerView.