【问题标题】:Vertical RecyclerView inside horizontal RecyclerView lag when scrolling滚动时水平 RecyclerView 内的垂直 RecyclerView 滞后
【发布时间】:2016-03-18 13:08:10
【问题描述】:

我有一个水平的 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.Adapter

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;
}

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    尝试使用这个

    reyclerView.setHasFixedSize(true) 
    

    【讨论】:

    • 请详细说明这解决了 OPs 问题的方式和原因
    • 这让我在水平 recyclerview 上的滞后消失了。