RecyclerView Adapter 性能方法
RecyclerView Adapter performance approach
我有一个从 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);
}
}
我想了解第二种方法在以下方面是否优于第一种方法:
- 响应式 UI;
- 性能;
我不是专家,但我认为第二种方法会强制您的 RecyclerView 重绘自身 ~ 30 次(每个 MyObject 重绘一次),而第一种方法只执行一个绘图过程。由于你的元素很少,我认为第一种方法是可以的。不过还是等这方面比我专业的人回答吧
第二种方法更好。 Recycler 视图将批处理所有添加调用,直到下一个动画帧,并且只会绑定新项目(如果它们可见)。如果能调用notifyItemRangeInserted
就更好了。当然我假设这个AsyncTask运行了多次,否则无所谓。
我有一个从 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);
}
}
我想了解第二种方法在以下方面是否优于第一种方法:
- 响应式 UI;
- 性能;
我不是专家,但我认为第二种方法会强制您的 RecyclerView 重绘自身 ~ 30 次(每个 MyObject 重绘一次),而第一种方法只执行一个绘图过程。由于你的元素很少,我认为第一种方法是可以的。不过还是等这方面比我专业的人回答吧
第二种方法更好。 Recycler 视图将批处理所有添加调用,直到下一个动画帧,并且只会绑定新项目(如果它们可见)。如果能调用notifyItemRangeInserted
就更好了。当然我假设这个AsyncTask运行了多次,否则无所谓。