【问题标题】:RecyclerView Adapter performance approachRecyclerView Adapter 性能方法
【发布时间】:2015-10-23 18:07:11
【问题描述】:

我有一个从 Internet 下载数据的 AsyncTask,创建少于 30 个 MyObject 对象,并将其添加到列表中。最后,我将创建一个 MyAdapter,将列表作为参数传递,并将 MyAdapter 设置为回收器视图适配器:

 myList.add(new MyObject("aa", "bb", cc"); //for each piece of data by Internet
 MyAdapter myAdapter = new MyAdapter(myList);
 recyclerView.setAdapter(myAdapter);

现在我正在考虑一种更好的编程方式:我在 AsyncTask 启动之前创建一个新的 MyAdapter,将其分配给 RecyclerView 并为每个新的 MyObject 我调用 MyAdapter 方法,将对象添加到列表中并调用 notifyItemInserted:

 myAdapter = new MyAdapter();
 recyclerView.setAdapter(myAdapter);
 myAdapter.addMyObject(new MyObject("aa", "bb", cc"); //for each piece of data by Internet

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
     private List<News> data = new ArrayAdapter<>();

     public void addMyObject(MyObject myObject) {
        data.add(myObject);
        notifyItemInserted(this.data.size() -1);
     }
}

我想了解第二种方法是否比第一种方法更好:

  1. 响应式用户界面;
  2. 性能;

【问题讨论】:

    标签: java android android-asynctask android-recyclerview android-adapter


    【解决方案1】:

    我不是专家,但我认为第二种方法会强制您的 RecyclerView 重绘自身〜 30 次(每个 MyObject 一次),而第一种方法只执行一个绘图过程。由于您的元素很少,我认为第一种方法是可以的。但是请等待比我更擅长该领域的人的答案。

    【讨论】:

    • 也许 RecyclerView 不会完全重绘自己。有了notifyItemInserted,只会绘制新的item,不是吗?
    • 我认为即使使用 notifyItemInserted 回收器,至少也可以对自身和之前插入的项目进行一些测量,但正如我所说,我不是 UI 领域的专家。
    【解决方案2】:

    第二种方法更好。 Recycler 视图将批处理所有的 add 调用,直到下一个动画帧,并且只会绑定新项目(如果它们是可见的)。如果您可以致电notifyItemRangeInserted,那就更好了。当然我假设这个 AsyncTask 运行了多次,否则,没关系。

    【讨论】:

    • 但是我发现使用第二种方法会引发异常,并显示以下消息:“当 RecyclerView 正在计算布局或滚动时无法调用此方法”
    • 这意味着您在 RecyclerView 正在计算布局时调用它。堆栈跟踪应该很明显,但如果您可以分享,我很乐意提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 2019-09-11
    • 1970-01-01
    • 2021-11-06
    相关资源
    最近更新 更多