Ich habe einen RecyclerView, in dem ich basierend auf einem Wert unterschiedliche Daten zu laden, die ich in einem update Verfahren bin zu ändern. Im Anschluss ist mein Code:RecyclerView nicht über ein eigenes Feld in onBindViewHolder aktualisieren, nachdem notifydatasetchanged()
public class PerformanceAdapter extends RecyclerView.Adapter<PerformanceAdapter.ViewHolder> {
ArrayList<Performance> list;
Context ctx;
int searchField;
public PerformanceAdapter(ArrayList list, Context ctx) {
this.list = new ArrayList<>();
this.list = list;
this.ctx = ctx;
}
public void updateList(ArrayList<Performance> list, int searchField) {
this.searchField = searchField;
ArrayList tempList = new ArrayList();
tempList.addAll(list);
Log.i("saz","Size on notifyupdate: "+list.size()+" and searchField: "+this.searchField);
this.list.clear();
this.list.addAll(tempList);
notifyDataSetChanged();
}
@Override
public PerformanceAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_performance_cardview, parent, false);
// set the view's size, margins, paddings and layout parameters
searchField = viewType;
ViewHolder vh = new ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(PerformanceAdapter.ViewHolder holder, int position) {
/* position = (int) convertView.getTag();
Log.i("saz","position value 2nd : "+position);*/
Performance performance = this.list.get(position);
Log.i("saz","searchField: "+searchField);
if (position%2 != 0) {
holder.cv.setCardBackgroundColor(ctx.getResources().getColor(R.color.lighter_gray));
} else {
holder.cv.setCardBackgroundColor(ctx.getResources().getColor(R.color.white));
}
Log.i("saz","searchField: "+searchField);
holder.txtModelName.setText(performance.getModelName());
if (searchField == 0) {
holder.cv.setVisibility(View.GONE);
} else if (searchField == 1) {
Log.i("saz","searchField: "+searchField);
holder.cv.setVisibility(View.VISIBLE);
holder.cv2.setVisibility(View.GONE);
holder.cv3.setVisibility(View.GONE);
holder.cv4.setVisibility(View.GONE);
} else if (searchField == 2) {
holder.cv.setVisibility(View.VISIBLE);
holder.cv2.setVisibility(View.GONE);
holder.cv3.setVisibility(View.GONE);
holder.cv4.setVisibility(View.GONE);
}
}
@Override
public int getItemViewType(int position) {
return searchField;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemCount() {
Log.i("saz","List size in recycler: "+list.size());
return this.list.size();
}
Dann rufe ich
updateList(list, 0)
updateList(list, 1)
or updateList(list, 2)
auf einen Klick.
Aber ich habe immer das Suchfeld als 0 in meinem bindViewHolder bekommen. Bitte helfen.
Können Sie den Code teilen, der 'updateList' aufruft? Gehen sie zusammen mit onNotify ... Funktionsaufruf? – Elye
Nein, sie machen nicht zusammen. Sie werden basierend auf der ausgewählten Position des Spinners aufgerufen. Der Code ist tatsächlich wie updateList (list, spinner.getSelectedItemPosition). – Sarfaraz
Ist die 'liste' immer gleich? Was passiert, wenn Sie die "Liste" bei der Aktualisierung geringfügig ändern? – Elye