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
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)
Schauen wir uns jeden an.
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;
}
});
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();
}
}
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.
Recommended Posts