[Für Anfänger] Mindestbeispiel zum Aktualisieren von RecyclerView mit DiffUtils in Java

Einführung

Wenn Sie eine Listenformatansicht unter Android anzeigen, ist es üblich, RecyclerView zu verwenden. Wenn der Inhalt der RecyclerView-Liste hinzugefügt, gelöscht oder aktualisiert werden musste, war es der Mainstream, die Benachrichtigungsmethode zu verwenden. DiffUtils wurde jedoch aus der Supoprt-Bibliothek 24 hinzugefügt, und es ist zum Mainstream geworden, dispatchUpdateTo zu verwenden, das den Diff der vergangenen Liste und der neuen Liste mit DiffUtils berechnet und die optimale Benachrichtigungsmethode für die Leistung basierend auf dem Ergebnis liest. Ich denke das da. Erstellen wir also ein Mindestmuster, um eine Liste mit DiffUtils hinzuzufügen.

↓ Abgeschlossenes Bild Screenshot_1588594304.png  Screenshot_1588594304.png

Wenn Sie nicht wissen, wie RecyclerView selbst angezeigt wird, lesen Sie bitte den folgenden Artikel. [[Für Anfänger] Mindestbeispiel für RecyclerView in Java](https://qiita.com/kawano108/items/7f92c8088d84d1f60434#Step zum Anzeigen)

Implementierungsschritte

  1. Erstellen Sie eine Instanz der Klasse, die Diff berechnet.
  2. Rufen Sie dispatchUpdateTo auf, wenn Sie eine neue Liste erhalten.
  3. Übergeben Sie die Liste.

Schauen wir uns jeden an.

1. Erstellen Sie eine Instanz der Klasse, die Diff berechnet.

Erstellen Sie eine Instanz der DiffResult-Klasse. Der Ausgangszustand ist wie folgt.

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. Rufen Sie dispatchUpdateTo auf, wenn Sie eine neue Liste erhalten.

Erstellen Sie eine Funktion, die die Liste im Adapter empfängt und dispatchUpdateTo von DiffResult aufruft.

public class MainAdapter extends RecyclerView.Adapter<MainAdapter.MainViewHolder> {

    private List<MainActivity.RowData> rowDataList;

    MainAdapter(List<MainActivity.RowData> rowDataList) {
        this.rowDataList = rowDataList;
    }
    
    /**
     *Aktualisieren Sie die Liste von RecyclerView basierend auf DiffResult
     * @param newItems Liste zum Aktualisieren
     */
     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);
    }

    /**
     *Eine Datenzeile
     */
    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);
        }
    }

    /**
     *ViewHolder-Erstellungsmethode
     *Nur zuerst angerufen.
     *Hier wird der ViewHolder, der mithilfe der ViewHolder-Layoutdatei als Inflation generiert wurde, an RecyclerView zurückgegeben.
     * @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);
    }

    /**
     *Binden Sie ViewHolder und RecyclerView
     *Schreiben Sie hier die Verarbeitung, die Sie gemeinsam für eine Ansichtszeile ausführen möchten. Diesmal habe ich nur den Text eingestellt.
     * @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);
    }

    /**
     *Anzahl der Zeilen in der Liste
     * @return
     */
    @Override
    public int getItemCount() {
        return rowDataList.size();
    }
}

3. Übergeben Sie die Liste.

Nachdem wir nun eine Funktion zum Aktualisieren im Adapter haben, rufen wir sie auf der Aktivitätsseite auf, auf der RecyclerView bereitgestellt ist.

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

        /**
         *RecyclerView-Setup
         */
        RecyclerView recyclerView = findViewById(R.id.main_recycler_view);

        //Aktivieren Sie die Einstellung, die die Layoutgröße von RecyclerView nicht ändert
        //Einstellungen zur Leistungsverbesserung.
        recyclerView.setHasFixedSize(true);

        //Legen Sie layoutManager in RecyclerView fest.
        //Abhängig vom Typ dieses layoutManager können Sie "einspaltige Liste" oder "zweispaltige Liste" auswählen.
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);

        //Generieren Sie einen Adapter und legen Sie ihn in RecyclerView fest
        this.mainAdapter = new MainAdapter(createRowData(page));
        recyclerView.setAdapter(mainAdapter);

        /**
         *Stellen Sie den Prozess so ein, dass mit einem Klick auf eine Schaltfläche 20 Zeilen hinzugefügt werden
         */
        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;
    }
}

Ich werde versuchen, es zu bauen, wenn ich es soweit schaffen kann. Wenn Sie die Taste drücken, erhöht sich die Anzahl der Zeilen um 20. Screenshot_1588594304.png

Referenz

Recommended Posts

[Für Anfänger] Mindestbeispiel zum Aktualisieren von RecyclerView mit DiffUtils in Java
[Für Anfänger] Mindestbeispiel für die Anzeige von RecyclerView in Java
Beispiel für eine EXCEL-Dateiaktualisierung mit JAVA
Java, Arrays für Anfänger
Lernen Sie aus "Na und", den Grundlagen von Java [für Anfänger]
[Für Super-Anfänger] Das Mindestwissen, das Sie mit Hashes und Symbolen berücksichtigen möchten
Beispiel zum Entpacken einer gz-Datei in Java
[Für Anfänger] So debuggen Sie mit Eclipse
Mindestkonfigurationsbeispiel für die automatische Freigabe von Lambda durch Java mit Code-Pipeline
[Java] [Für Anfänger] So fügen Sie Elemente direkt in ein zweidimensionales Array ein
[Java] So testen Sie, ob es in JUnit null ist
[Einführung in Java] Grundlagen der Java-Arithmetik (für Anfänger)
Punkte, die bei Java beachtet werden müssen, sind gleich
Für meinen Sohn, der angefangen hat, Java mit "Einführung in Java" in einer Hand zu studieren
Aufrufen von Funktionen in großen Mengen mit Java Reflection
Beispielcode zum Konvertieren von List in List <String> in Java Stream
Dinge, auf die Sie bei der zukünftigen Java-Entwicklung achten sollten
Einführung in Java für Anfänger Grundkenntnisse der Java-Sprache ①
Versuchen Sie, mit Java eine Verbindung zu AzureCosmosDB Emulator for Docker herzustellen
Ausführen des WebCamCapture-Beispiels von NyARToolkit für Java
In Java 2D-Karte speichern und mit for-Anweisung drehen
[Für Anfänger] Erläuterung von Klassen, Instanzen und Statik in Java
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 1
Beispielcode zum Parsen von Datum und Uhrzeit mit Java SimpleDateFormat
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben
Mit Java8 LocalDateTime und Java6 Date ist es schwierig, Mindestwerte zu verarbeiten
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 2
Für Java-Anfänger: Liste, Karte, Iterator / Array ... Wie konvertiere ich?
Untersucht, wie Dienste mit Watson SDK für Java aufgerufen werden
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 0
[Java] Beispielprojekt zum Entwickeln von Webanwendungen mit Spring Boot
Java zum Spielen mit Function
Java-Debug-Ausführung [für Java-Anfänger]
[Java] Grundlegende Aussage für Anfänger
So aktualisieren Sie mit activerecord-import
Stellen Sie mit Java eine Verbindung zur Datenbank her
Stellen Sie mit Java eine Verbindung zu MySQL 8 her
Java für Anfänger, Daten verstecken
Java-Anwendung für Anfänger: Stream
[Java] So suchen Sie mit der Methode includes nach Werten in einem Array (oder einer Liste)
Ich habe versucht, Java-Anfänger so einzustellen, dass sie Tastenkombinationen in Eclipse verwenden
[Tipps] So lösen Sie Probleme mit XCode und Swift für Anfänger
So wechseln Sie die Java-Version mit direnv im Terminal auf dem Mac
Quelle zur Anzeige des Zeichenarrays mit numberPicker in Android Studio (Java)
[Java] Ich möchte mit dem Schlüssel im Objekt eindeutig arbeiten
Beispielcode zum Aufrufen der Yahoo! Local Search API in Java
[Für Anfänger] Ich möchte mit einem Auswahlbefehl automatisch vorregistrierte Daten in das Eingabeformular eingeben.
Java mit Ramen lernen [Teil 1]
Morphologische Analyse in Java mit Kuromoji
Umgebungsbau mit Docker für Anfänger
Multithreaded passend zur [Java] Vorlage
[Java] Mit Arrays.asList () zu beachtende Punkte
Firestore-Daten in RecyclerView [Java] anzeigen
Wagen Sie es, Kaggle mit Java herauszufordern (1)
Wie man JAVA in 7 Tagen lernt
Aktivieren Sie OpenCV mit Java8. (Für mich)