0

У меня есть AsyncTask, загружающий данные из Интернета, создайте менее 30 объект MyObject и добавьте его в список. В конце концов, я буду создавать MyAdapter проходящий список в качестве параметра и установите MyAdapter как адаптер вида утилизатора:Подход производительности адаптера RecyclerView

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

Сейчас я думаю о лучшем способе программирования: создать новый MyAdapter перед тем из AsyncTask начинает назначьте, что в 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. Отзывчивый UI;
  2. Производительность;

ответ

2

Я не эксперт, но я считаю, что второй подход заставит RecyclerView перерисовать себя ~ 30 раз (по одному для каждого из MyObject), в то время как первый выполняет только один процесс рисования. Поскольку у вас мало элементов, я думаю, что первый подход в порядке. Но ждите ответа кого-то более квалифицированного в этой области, чем я.

+0

Возможно, RecyclerView не будет полностью перерисовываться. С notifyItemInserted будет только нарисовать новый элемент, не так ли? – helloimyourmind

+0

Я думаю, что даже с notifyItemInserted recycler, по крайней мере, должен выполнить некоторые измерения самого себя и ранее вставленных элементов, но, как я уже сказал, я не являюсь экспертом в области пользовательского интерфейса. – MatteoBelfiori

0

Второй подход лучше. Recycler view будет загружать все вызовы add до следующего кадра анимации и будет связывать только новые элементы (если они видны). Еще лучше, если вы можете позвонить по номеру notifyItemRangeInserted. Конечно, я предполагаю, что этот AsyncTask работает несколько раз, иначе это не имеет значения.

+0

Но я обнаружил, что со вторым подходом возникает исключение со следующим сообщением: «Невозможно вызвать этот метод, в то время как RecyclerView вычисляет макет или прокрутку» – helloimyourmind

+0

Ну, это означает, что вы вызываете его, а RecyclerView находится в середине вычисления макет. Трассировка стека должна быть очевидной, но я рад помочь, если вы можете поделиться ею. – yigit

Смежные вопросы