Я видел много способов написать 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);
}
}
Производительность здесь не играет роли, но используйте 1 для удобочитаемости/разделения
Первый подход является лучшим подходом для читаемости кода и разделения проблем, когда ваш Recylerview не зависит от представления, и вы просто передаете ему данные, которые позаботятся о заполнении данных. второй подход плохой, потому что мы даем слишком много информации MainActivity, чья работа состоит в том, чтобы просто отображать данные, а код тесно связан, что затрудняет модульное тестирование.
В качестве примечания: анонимный класс в примере 2 соответствует классу с именем MainActivity$1 (или аналогичному) во время компиляции. Таким образом, разницы в логике практически нет. Однако другие правы, пример 1 следует предпочесть, потому что он позволяет повторно использовать ваш код.
лучший способ - установить класс адаптера вне основного класса, поскольку ваше объяснение просто использует ваш первый класс
почему это лучший способ?
вам просто нужно узнать больше о шаблоне проектирования, чтобы наилучшим образом спроектировать свой код.
Адаптер должен быть реализован как отдельный класс, потому что это упрощает его повторное использование:
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));
Таким образом, вы можете повторно использовать его более чем в одном действии/фрагменте. Этот шаблон повторно используемого кода следует предпочесть, потому что вам не нужно создавать классы несколько раз как анонимные классы, если это необходимо.
если вы хотите повторно использовать один и тот же класс
Adapter, создайте отдельный класс дляAdapter