Lors de l'affichage d'une vue au format liste sur Android, il est courant d'utiliser RecyclerView. Lorsqu'il était nécessaire d'ajouter / supprimer / mettre à jour le contenu de la liste RecyclerView, il était courant d'utiliser la méthode de notification. Cependant, DiffUtils a été ajouté à partir de Supoprt Library 24, et il est devenu courant d'utiliser dispatchUpdateTo qui calcule le diff de la liste précédente et de la nouvelle liste avec DiffUtils et lit la méthode de notification optimale pour les performances en fonction du résultat. Je pense que là. Créons donc un échantillon minimum pour ajouter une liste avec DiffUtils.
↓ Image terminée
Si vous ne savez pas comment afficher RecyclerView lui-même, reportez-vous à l'article suivant. [[Pour les débutants] Échantillon minimum de RecyclerView en Java](https://qiita.com/kawano108/items/7f92c8088d84d1f60434# Étape à afficher)
Regardons chacun d'eux.
Créez une instance de la classe DiffResult. L'état initial est le suivant.
DiffUtil.DiffResult result = DiffUtil.calculateDiff(new DiffUtil.Callback() {
@Override
public int getOldListSize() {
return 0;
}
@Override
public int getNewListSize() {
return 0;
}
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return false;
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
return false;
}
});
Créez une fonction qui reçoit la liste dans l'adaptateur et appelle dispatchUpdateTo depuis DiffResult.
public class MainAdapter extends RecyclerView.Adapter<MainAdapter.MainViewHolder> {
private List<MainActivity.RowData> rowDataList;
MainAdapter(List<MainActivity.RowData> rowDataList) {
this.rowDataList = rowDataList;
}
/**
*Mettez à jour la liste de RecyclerView bien basée sur DiffResult
* @param newItems List à mettre à jour
*/
public void setData(final List<RowData> newItems) {
DiffUtil.DiffResult result = DiffUtil.calculateDiff(new DiffUtil.Callback() {
@Override
public int getOldListSize() {
return rowDataList.size();
}
@Override
public int getNewListSize() {
return newItems.size();
}
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return rowDataList.get(oldItemPosition).hogeTitle.equals(newItems.get(newItemPosition).hogeTitle);
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
return rowDataList.get(oldItemPosition).hogeContents.equals(newItems.get(newItemPosition).hogeContents);
}
});
this.rowDataList = newItems;
result.dispatchUpdatesTo(this);
}
/**
*Une ligne de données
*/
static class MainViewHolder extends RecyclerView.ViewHolder {
ImageView hogeImage;
TextView hogeTitle;
TextView hogeContents;
MainViewHolder(@NonNull View itemView) {
super(itemView);
hogeImage = itemView.findViewById(R.id.hoge_image_view);
hogeTitle = itemView.findViewById(R.id.hoge_title_text_view);
hogeContents = itemView.findViewById(R.id.hoge_contents_text_view);
}
}
/**
*Méthode de création ViewHolder
*Seulement appelé en premier.
*Ici, le ViewHolder généré à l'aide du fichier de disposition ViewHolder comme inflation est renvoyé à RecyclerView.
* @param parent
* @param viewType
* @return
*/
@NonNull
@Override
public MainViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_holder_main, parent, false);
return new MainViewHolder(view);
}
/**
*Lier ViewHolder et RecyclerView
*Écrivez ici le traitement que vous souhaitez effectuer en commun pour une ligne de View. Cette fois, je ne mets que le texte.
* @param holder
* @param position
*/
@Override
public void onBindViewHolder(@NonNull MainViewHolder holder, int position) {
RowData rowData = this.rowDataList.get(position);
holder.hogeTitle.setText(rowData.hogeTitle);
holder.hogeContents.setText(rowData.hogeContents);
}
/**
*Nombre de lignes dans la liste
* @return
*/
@Override
public int getItemCount() {
return rowDataList.size();
}
}
Maintenant que nous avons une fonction de mise à jour dans l'adaptateur, appelons-la du côté Activité où RecyclerView est monté.
public class MainActivity extends AppCompatActivity {
private int page = 1;
@Nullable
private MainAdapter mainAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
*Configuration de RecyclerView
*/
RecyclerView recyclerView = findViewById(R.id.main_recycler_view);
//Activez le paramètre qui ne modifie pas la taille de la mise en page de RecyclerView
//Paramètres pour améliorer les performances.
recyclerView.setHasFixedSize(true);
//Définissez layoutManager dans RecyclerView.
//Selon le type de ce layoutManager, vous pouvez sélectionner "liste à une colonne" ou "liste à deux colonnes".
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
//Générer l'adaptateur et le définir dans RecyclerView
this.mainAdapter = new MainAdapter(createRowData(page));
recyclerView.setAdapter(mainAdapter);
/**
*Configurez le processus pour ajouter 20 lignes en cliquant sur un bouton
*/
Button button = findViewById(R.id.main_button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
page ++;
mainAdapter.setData(createRowData(page));
}
});
}
private List<RowData> createRowData(@Nullable int page) {
List<RowData> dataSet = new ArrayList<>();
int i = 1;
while (i < page * 20) {
RowData data = new RowData();
data.hogeTitle = "hogeTitle" + Integer.toString(i);
data.hogeContents = "hogeContents" + Integer.toString(i);
dataSet.add(data);
i = i + 1;
}
return dataSet;
}
class RowData {
Image hogeImage;
String hogeTitle;
String hogeContents;
}
}
J'essaierai de le construire quand je pourrai le faire jusqu'à présent. Lorsque vous appuyez sur le bouton, le nombre de lignes augmente de 20.
Recommended Posts