Ich habe eine VerticalGridView, die einen RecyclerView.Adapter verwendet, um die Elemente aufzufüllen. Ich habe festgestellt, dass die onBindViewHolder() -Methode nicht aufgerufen wird, wenn das potenzielle Element außerhalb des Darstellungsbereichs ist. Unglücklicherweise verursacht dies eine NullPointerException von einer anderen Methode, weil ich eine TextView-Referenz in der onBindViewHolder() -Methode abfange und sie zur späteren Manipulation an eine externe Variable übergebe.Erzwingen RecyclerView.Adapter, um onBindViewHolder() für alle Elemente aufzurufen
Von dem, was ich verstehe, wird der Verweis auf die TextView erstellt, wenn das Viewholder-Objekt instanziiert wird.
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView txtCategoryName;
public TextView txtCategoryDefectTotal;
public View categoryBoxRoot;
public ViewHolder(View itemView) {
super(itemView);
txtCategoryName = (TextView) itemView.findViewById(R.id.textViewCategoryName);
txtCategoryDefectTotal = (TextView) itemView.findViewById(R.id.textViewCategoryTotalDefects);
categoryBoxRoot = itemView.findViewById(R.id.root_category_box);
}
}
Gibt es eine Möglichkeit onBindViewHolder zu zwingen, auf alle Elemente mindestens einmal aufgerufen werden, wenn der Adapter instanziiert wird?
Ich habe die Vorschläge here ohne Erfolg versucht.
Ich verstehe, dass OnBindViewHolder für alle Elemente erzwingen gegen die whole purpose of the RecycleView.Adapter arbeiten würde. Daher bin ich offen für weitere Vorschläge, wie ich diese TextView-Referenz erfassen kann.
Als vorübergehende Lösung für dieses Problem kann ich einen try catch-Block um die Methode verwenden, die die NullPointerException generiert. Ich bin jedoch besorgt, dass das Fehlen der Referenz bedeutet, dass ich in Zukunft Fehler einführen könnte.
Verwenden Sie Ihre OnClickListener auf der ViewHolder Klasse selbst, nicht 'onBindViewHolder' - Sie sollten nicht zu schaffen ein neuer onclicklistener für jede Zeile. http://StackOverflow.com/a/30285361/4252352 –
Das ist eine nette Optimierung aber das hilft mir nicht mit dem Problem zur Hand. Ich brauche die TextView-Referenz, damit ich sie von einer externen Methode aktualisieren kann. – bergler77
Warum nicht die Datenquelle aktualisieren und 'notifyDataSetChanged();' oder 'notifyItemChanged (position);' aufrufen (was eine weniger kostspielige Operation ist) auf Ihrem Adapter. –