Verwenden von notifyItemRemoved oder notifyDataSetChanged mit RecyclerView in Android
Ich bin erstellen einer Liste von Karten die Anzeige über die RecyclerView, wo jede Karte hat eine Schaltfläche, um entfernen Sie die Karte aus der Liste.
Wenn ich notifyItemRemoved() um die Karte zu entfernen, in der RecyclerView, es entfernt das Element und belebt feines, aber die Daten in der Liste wird nicht korrekt aktualisiert.
Wenn stattdessen wechsle ich die notifyDataSetChanged (), dann die Elemente in der Liste werden entfernt und ordnungsgemäß aktualisiert, aber dann werden die Karten dont animieren.
Hat jemand irgendeine Erfahrung mit der notifyItemRemoved() und wissen, warum es verhält sich anders als notifyDataSetChanged?
Hier einige peiece der code, den ich verwende:
private List<DetectedIssue> issues = new ArrayList<DetectedIssue>();
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
//- get element from your dataset at this position
//- replace the contents of the view with that element
if(position >0){
RiskViewHolder riskHolder = (RiskViewHolder)holder;
final int index = position - 1;
final DetectedIssue anIssue = issues.get(index);
riskHolder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
int index = issues.indexOf(anIssue);
issues.remove(anIssue);
notifyItemRemoved(index);
//notifyDataSetChanged();
} catch (SQLException e) {
e.printStackTrace();
}
}
});
}
}
@Override
public int getItemCount() {
return (issues.size()+1);
}
InformationsquelleAutor der Frage revolutionary | 2015-01-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden notifyItemRangeChanged(position, von getitemcount()); nach notifyItemRemoved(position);
Sie nicht brauchen, um verwenden Sie einen index, nur position zu verwenden. Siehe code unten.
InformationsquelleAutor der Antwort Akshay Mahajan
Versucht
und arbeiten wie ein Charme.
InformationsquelleAutor der Antwort Grender
mein Fehler ,
notifyItemChanged(position) hilflos ist,wird das Element von der position entfernt werden kann ,und das Element von position+1 ist in Ordnung,aber die Elemente beginnen, aus der position+2,erhalten Sie eine Ausnahme, nutzen Sie bitte notifyItemRangeChanged(position,von getitemcount());
nach notifyItemRemoved(position);
wie diese:
InformationsquelleAutor der Antwort TikT
Als @pskink schlug es sein soll (index+1) in meinem Fall mit
notifyItemRemoved(index+1)
, wahrscheinlich, weil ich bin die Reservierung der top-index, d.h.position=0
für einen header.InformationsquelleAutor der Antwort revolutionary
Können Sie
getLayoutPosition()
von derRecyclerView.ViewHolder
getLayoutPosition()
stellt die exakte position des Elements im layout und code istInformationsquelleAutor der Antwort sree
InformationsquelleAutor der Antwort dong sheng
In meinem Fall nutze ich Content-Anbieter und eine Benutzerdefinierte RecyclerView Adapter mit Cursor. Diese Zeile von code ist, wo Sie Benachrichtigen,:
Vorausgesetzt, In Ihrem recyclerView adapter (Löschen-Taste):
Und in der Datenbank-Provider:
InformationsquelleAutor der Antwort MohammadL
Sollten Sie hinzufügen /entfernen von listener im ViewHolder Klasse
InformationsquelleAutor der Antwort Kishan Vaghela