Я пытаюсь создать 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()));
}
Хороший вопрос. В настоящее время я пытаюсь сделать то же самое. Если я это выясню, я отправлю ответ. –
Любое обновление по этому вопросу? Я успешно реализовал дочерний элемент RecyclerView внутри элемента своего родителя, и он работает, но с плохими характеристиками. даже попытался сделать это лучше: https://medium.com/@p.tournaris/recyclerview-how-we- достиг-60-FPS-советы-в-workables-андроид-приложение-recyclerviews-c646c796473C# .6elg95wbi – rexxar