在水平滚动的RecyclerView中嵌套垂直滚动的RecyclerView,在滚动时会出现卡顿现象。

4
我有一个水平的RecyclerView。每个子项都包含一个TextView和一个垂直的RecyclerView。垂直的RecyclerView的子项只包含一个TextView。
垂直滚动非常流畅,但是水平滚动却很卡顿。我尝试在onBindViewHolder中使用swapAdapter而不是setAdapter,但这并没有解决问题。我还尝试更改数据集并调用notifyDataSetChanged(),但这也没有帮助。
编辑:
我刚刚发现在横屏模式下滚动实际上是流畅的。
水平RecyclerView.Adapter
private SparseArray<GroupArrayAdapter> adapters;

private ArrayList<Category> categories;

private Activity context;

public CategoryArrayAdapter(Context context, ArrayList<Category> categories) {
    this.categories = categories;
    this.context = (Activity)context;

    adapters = new SparseArray<GroupArrayAdapter>();
    for (int i = 0; i < categories.size(); i++) {
        adapters.append(i, new GroupArrayAdapter(context, categories.get(i).getGroups()));
    }
}

public class ViewHolder extends RecyclerView.ViewHolder {
    public TextView name;
    public RecyclerView list;

    public ViewHolder(View view) {
        super(view);
        name = (TextView) view.findViewById(R.id.lblCategoryName);
        list = (RecyclerView) view.findViewById(R.id.lstGroups);
        list.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false));
        list.addItemDecoration(new GroupItemDecoration((int)context.getResources().getDimension(R.dimen.gap)));
        //list.setAdapter(new GroupArrayAdapter(context, new ArrayList<Group>()));
    }
}

@Override
public int getItemCount() {
    return categories.size();
}

@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
    Category category = categories.get(position);
    viewHolder.name.setText(category.getName());
    viewHolder.list.swapAdapter(adapters.get(position), false);
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_category, parent, false);
    ViewHolder viewHolder = new ViewHolder(view);
    return viewHolder;
}

垂直滚动的RecyclerView适配器

private ArrayList<Group> groups;

public GroupArrayAdapter(Context context, ArrayList<Group> groups) {
    this.groups = groups;
}

public class ViewHolder extends RecyclerView.ViewHolder {
    public TextView name;

    public ViewHolder(View view) {
        super(view);
        name = (TextView) view.findViewById(R.id.lblGroupName);
    }
}

@Override
public int getItemCount() {
    return groups.size();
}

@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
    Group group = groups.get(position);
    viewHolder.name.setText(group.getName());
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = null;
    view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_group_text, parent, false);
    ViewHolder viewHolder = new ViewHolder(view);
    return viewHolder;
}
2个回答

1
尝试使用这个。
reyclerView.setHasFixedSize(true) 

请详细说明如何以及为什么这样修复了原帖作者的问题。 - LJᛃ
这使得我在水平的RecyclerView上的延迟问题消失了。 - Alexandre Prazeres

0

使用共享的RecyclerView池可能会有所帮助。 不要忘记设置setMaxRecycledViews数量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接