2016-05-13 5 views
1

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.

+0

Können Sie den Code teilen, der 'updateList' aufruft? Gehen sie zusammen mit onNotify ... Funktionsaufruf? – Elye

+0

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

+0

Ist die 'liste' immer gleich? Was passiert, wenn Sie die "Liste" bei der Aktualisierung geringfügig ändern? – Elye

Antwort

0

Sie es mit Viewtype überschrieben, das ist immer 0, da nur ein Typ ist.

@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; 
} 
+0

Der 'viewType' kommt von' getItemViewType', der auf dem aktualisierten 'searchField' basiert. – Elye

+0

@stas Auch wenn ich mein searchField mit itemViewType überschreiben lasse, bekomme ich das gleiche Ergebnis. – Sarfaraz

+0

@Sarfazar In einer mehr notifyDataSetChanged nur nach 'this.list.clear();' –