[Pour les débutants] Exemple minimum pour mettre à jour RecyclerView avec DiffUtils en Java

introduction

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 Screenshot_1588594304.png  Screenshot_1588594304.png

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)

Étapes de mise en œuvre

  1. Créez une instance de la classe qui calcule Diff.
  2. Appelez dispatchUpdateTo lorsque vous recevez une nouvelle liste.
  3. Passez la liste.

Regardons chacun d'eux.

1. Créez une instance de la classe qui calcule Diff.

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;
    }
});

2. Appelez dispatchUpdateTo lorsque vous recevez une nouvelle liste.

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();
    }
}

3. Passez la liste.

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. Screenshot_1588594304.png

référence

Recommended Posts

[Pour les débutants] Exemple minimum pour mettre à jour RecyclerView avec DiffUtils en Java
[Pour les débutants] Exemple minimum pour afficher RecyclerView en Java
Exemple de mise à jour de fichier EXCEL avec JAVA
Java, des tableaux pour débuter avec les débutants
Apprenez de «Et alors», les bases de Java [pour les débutants]
[Pour les super débutants] Les connaissances minimales que vous voulez garder à l'esprit avec les hachages et les symboles
Exemple pour décompresser le fichier gz en Java
[Pour les débutants] Comment déboguer avec Eclipse
Exemple de configuration minimale pour publier automatiquement Lambda par Java avec un pipeline de code
[Java] [Pour les débutants] Comment insérer des éléments directement dans un tableau à deux dimensions
[Java] Comment tester s'il est nul dans JUnit
[Introduction à Java] Bases de l'arithmétique Java (pour les débutants)
Points à connaître avec Java Equals
Pour mon fils qui a commencé à étudier Java avec "Introduction à Java" dans une main
Comment appeler des fonctions en bloc avec la réflexion Java
Exemple de code pour convertir List en List <String> dans Java Stream
Points à surveiller dans le développement futur de Java
Introduction à Java pour les débutants Connaissance de base du langage Java ①
Essayez de vous connecter à l'émulateur AzureCosmosDB pour Docker avec Java
Comment exécuter l'exemple WebCamCapture de NyARToolkit pour Java
Stocker dans une carte Java 2D et tourner avec pour instruction
[Pour les débutants] Explication des classes, des instances et des statiques en Java
Tutoriel pour créer un blog avec Rails pour les débutants Partie 1
Exemple de code pour analyser la date et l'heure avec SimpleDateFormat de Java
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3
Difficile de gérer les valeurs minimales avec Java8 LocalDateTime et Java6 Date
Tutoriel pour créer un blog avec Rails pour les débutants Partie 2
Pour les débutants Java: List, Map, Iterator / Array ... Comment convertir?
A étudié comment appeler des services avec Watson SDK pour Java
Tutoriel pour créer un blog avec Rails pour les débutants Partie 0
[Java] Exemple de projet de développement d'applications Web avec Spring Boot
Java pour jouer avec Function
Exécution de débogage Java [pour les débutants Java]
[Java] Instruction de base pour les débutants
Comment mettre à jour avec activerecord-import
Connectez-vous à DB avec Java
Connectez-vous à MySQL 8 avec Java
Java pour les débutants, masquage des données
Application Java pour les débutants: stream
[Java] Comment rechercher des valeurs dans un tableau (ou une liste) avec la méthode contains
J'ai essayé de configurer les débutants Java pour qu'ils utilisent des touches de raccourci dans eclipse
[Astuces] Comment résoudre les problèmes avec XCode et Swift pour les débutants
Comment changer de version Java avec direnv dans le terminal sur Mac
Source pour afficher le tableau de caractères avec numberPicker dans Android Studio (Java)
[Java] Je veux effectuer distinctement avec la clé dans l'objet
Exemple de code pour appeler l'API Yahoo! Local Search en Java
[Pour les débutants] Je souhaite saisir automatiquement des données pré-enregistrées dans le formulaire de saisie avec une commande de sélection.
Java pour apprendre avec les ramen [Partie 1]
Analyse morphologique en Java avec Kuromoji
Construction d'environnement avec Docker pour les débutants
Multithread pour s'adapter au modèle [Java]
[Java] Points à noter avec Arrays.asList ()
Afficher les données Firestore dans RecyclerView [Java]
Osez défier Kaggle avec Java (1)
Comment apprendre JAVA en 7 jours
Activez OpenCV avec java8. (Pour moi-même)