Каков практический способ написать recyclerview

Я видел много способов написать Recyclerview. Но я не знаю, как лучше всего с точки зрения производительности.

У меня есть два способа написать Recyclerview, они одинаковые или есть разница?

Первый способ - написать его в отдельном классе адаптера.

Адаптер.java

public class Adapter  extends RecyclerView.Adapter<Adapter.MyViewHolder> {

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    return null;
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) {

}

@Override
public int getItemCount() {
    return 0;
}

class MyViewHolder extends RecyclerView.ViewHolder{
    public MyViewHolder(@NonNull View itemView) {
        super(itemView);
    }
}
}

Второй способ - написать это так внутри MainActivity или Fragment.

 recyclerView.setAdapter(new RecyclerView.Adapter() {
         @NonNull
         @Override
         public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
             return null;
         }

         @Override
         public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
         }

         @Override
         public int getItemCount() {
             return 0;
         }
     });

}
public class MyViewHolder extends RecyclerView.ViewHolder{
    public MyViewHolder(@NonNull View itemView) {
        super(itemView);
    }
}

если вы хотите повторно использовать один и тот же класс Adapter, создайте отдельный класс для Adapter

AskNilesh 03.05.2019 09:56

Производительность здесь не играет роли, но используйте 1 для удобочитаемости/разделения

Tim 03.05.2019 09:56

Первый подход является лучшим подходом для читаемости кода и разделения проблем, когда ваш Recylerview не зависит от представления, и вы просто передаете ему данные, которые позаботятся о заполнении данных. второй подход плохой, потому что мы даем слишком много информации MainActivity, чья работа состоит в том, чтобы просто отображать данные, а код тесно связан, что затрудняет модульное тестирование.

Anirudh Goud 03.05.2019 10:20

В качестве примечания: анонимный класс в примере 2 соответствует классу с именем MainActivity$1 (или аналогичному) во время компиляции. Таким образом, разницы в логике практически нет. Однако другие правы, пример 1 следует предпочесть, потому что он позволяет повторно использовать ваш код.

Ch4t4r 03.05.2019 10:46
0
4
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

лучший способ - установить класс адаптера вне основного класса, поскольку ваше объяснение просто использует ваш первый класс

почему это лучший способ?

Tim 03.05.2019 09:59

вам просто нужно узнать больше о шаблоне проектирования, чтобы наилучшим образом спроектировать свой код.

Ahmed El-Nakib 03.05.2019 10:00
Ответ принят как подходящий

Адаптер должен быть реализован как отдельный класс, потому что это упрощает его повторное использование:

 public class YourAdapter extends RecyclerView.Adapter<Adapter.MyViewHolder> {

 private ArrayList<YourModel> list = new ArrayList();

public YourAdapter(ArrayList<YourModel> list){
 this.list = list;
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    //return the viewholder
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) {
 //deal with data
}

@Override
public int getItemCount() {
    //return the list number
}

class MyViewHolder extends RecyclerView.ViewHolder{
    public MyViewHolder(@NonNull View itemView) {
        super(itemView);
      //bind the views
    }
}
}

Чем в вашей деятельности/фрагменте вы можете использовать его следующим образом:

//after you have initialized recyclerview and added the layoutmanager
//prepare the list for the adapter
recyclerView.setAdapter(new YourAdapter(yourList));

Таким образом, вы можете повторно использовать его более чем в одном действии/фрагменте. Этот шаблон повторно используемого кода следует предпочесть, потому что вам не нужно создавать классы несколько раз как анонимные классы, если это необходимо.

Другие вопросы по теме