2017-10-25 2 views
2

Recycler Artikel Farbwechsel nach dem Scrollen wiederholen.Recycler Ansicht Artikel Farbwechsel nach dem Scrollen wiederholen

Ich habe die Farbe an der Position der Recyclerview-Liste geändert. Beim Scrollen tritt ein anderer Punkt unten auf. Und es wiederholt sich im Muster. Wie löst man das?

holder.recycle_Listing.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      itemListener.connectionClicked(v,position, itemtype); 

      holder.mainlayout.setBackgroundColor(Color.parseColor("#e927a4d1")); 

     } 
    }); 
+0

Fragen können Sie versuchen, https://stackoverflow.com/questions/40692214/changing-background-color-of-selected-item-in-recyclerview –

+0

bitte mehr Code aus Ihr Adapter, denn nach dem Scrollen verändert sich die Farbe, natürlich wird die Ansicht mit derselben Position wie die Position, auf die Sie geklickt haben, neu erstellt. –

+0

ja, ich fand eine Lösung für das @AchmadNaufalSyafiq. Danke für die Antwort. –

Antwort

0

nur alle Artikel Schlüssel in einem Array und das ausgewählte Array auch durch meine Adapter-Klasse übergeben gespeichert. Selbst ein einfacher Farbwechsel funktioniert in diesem Format einwandfrei. Hier wird der Code gemäß meiner Anforderung geändert.

@Override 
    public void onBindViewHolder(final ICConversationHomeAddConnectionsAdapter.ViewHolder holder, final int position) { 

     JsonObject object = dataArray.get(position).getAsJsonObject(); 
     if(selectedArray.contains(object.get("userkey").getAsString())) 
     { 
      GradientDrawable borCol = new GradientDrawable(); 
      borCol.setCornerRadius(7); 
      borCol.setColor(Color.parseColor("#ffffff")); 
      borCol.setStroke(2, Color.parseColor("#60B9E1")); 
      holder.recycle_Listing.setBackgroundDrawable(borCol); 
      //holder.mainlayout.setBackgroundColor(Color.parseColor("#e927a4d1")); 
     } 
     else 
     { 
      GradientDrawable borCol = new GradientDrawable(); 
      borCol.setCornerRadius(7); 
      borCol.setColor(Color.parseColor("#ffffff")); 
      borCol.setStroke(1, Color.parseColor("#e0e0e0")); 
      holder.recycle_Listing.setBackgroundDrawable(borCol); 
      //holder.mainlayout.setBackgroundColor(Color.parseColor("#f1f1f1")); 
     } 


      holder.profileName.setText(object.get("name").getAsString()); 

     holder.recycle_Listing.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 


       holder.mainlayout.setSelected(!holder.mainlayout.isSelected()); 

       if (holder.mainlayout.isSelected()) { 
        GradientDrawable borCol = new GradientDrawable(); 
        borCol.setCornerRadius(7); 
        borCol.setColor(Color.parseColor("#ffffff")); 
        borCol.setStroke(2, Color.parseColor("#60B9E1")); 
        holder.recycle_Listing.setBackgroundDrawable(borCol); 
        // holder.mainlayout.setBackgroundColor(Color.parseColor("#11B5DA")); 
       } else { 
        GradientDrawable borCol = new GradientDrawable(); 
        borCol.setCornerRadius(7); 
        borCol.setColor(Color.parseColor("#ffffff")); 
        borCol.setStroke(1, Color.parseColor("#e0e0e0")); 
        holder.recycle_Listing.setBackgroundDrawable(borCol); 
        // holder.mainlayout.setBackgroundColor(Color.parseColor("#f1f1f1")); 
       } 



       itemListener.connectionClicked(v,position, itemtype); 


       //holder.mainlayout.setBackgroundColor(Color.parseColor("#11B5DA")); 
       //holder.mainlayout.setBackgroundColor(Color.parseColor("#f1f1f1")); 
      } 
     }); 



    } 

Dieser Code funktioniert ohne wiederholten Farbwechsel im Recycler. Wenn irgendwelche Fragen zögern, über Kommentare oder Chat

1

Ich glaube, Sie Ihre Hintergrundfarbe in void onBindViewHolder(VH holder, int position); wie

List<Integer> selectedPosition = new ArrayList(yourDataSize); 
void onBindViewHolder(VH holder, int position){ 

    if(selectedPosition.get(position) == 1){ 
     holder.mainlayout.setBackgroundColor(Color.parseColor("#e927a4d1")); 
    }else { 
     holder.mainlayout.setBackgroundColor(normalColor); 
    } 

    //when the item clicked 
    selectedPosition.add(position,1); 

} 
+0

Was ist Datenklasse? –

+0

Ich aktualisiere meine Antwort. @ SARATHV – CoXier

+0

Lösung gefunden und hier gepostet. Danke –

0

Diese Funktion gibt relative Position absolut nicht so einstellen, wenn die Bildschirmposition durch einen neuen Wert ersetzt wird gescrollt wird. Verwenden Sie die Position aus Ihrer Liste für das gewünschte Ergebnis.

0

Es ist aufgrund der Wiederverwertung von Viewholder von Recycler anzuzeigen. Versuchen Sie diese Es funktionierte für mich.

public ListViewHolder(View itemView) { 
     super(itemView); 

     this.setIsRecyclable(false); 


    } 
+0

Ich denke nicht, dass es eine gute Idee ist, da die Recycler-Ansicht für das Caching verwendet wird. – CoXier

+0

deaktiviert den Zweck des Recyclers mit diesem Code ?. Es ist keine akzeptable Methode. –

+0

@SARATHV Meine Methode sollte für Sie arbeiten. – CoXier

0

versucht diese Methode in Ihrer Adapter Klasse zu implementieren, kann es Ihr Problem

@Override 
    public void onViewRecycled(ViewHolderProduct holder) { 
     super.onViewRecycled(holder); 
     holder.mainlayout.removeAllViews(); 
} 
2

Die Recycler Ansicht rezykliert in OnBindViewHolder.So die Ansicht lösen ist, wenn Elemente geklickt werden es in einem anderen reflektiert wird Positionen. Um das zu lösen. Erstellen Sie ein globales SparseBooleanArray zum Speichern der angeklickten Position.

Dann innerhalb des endgültigen Viewholder fügen Sie den clickListener und onClick Store die Position des angeklickten Elements.

public class ViewHolder extends RecyclerView.ViewHolder { 
    public YOURVIEW view; 
    public ViewHolder(View v) { 
     super(v); 
     view = (YOURVIEW) v.findViewById(R.id.YOURVIEWID); 
     view.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       array.put(getAdapterPosition(),true); 
       notifyDataSetChanged(); 
      } 
     }); 
    } 
} 

Und innen OnBindViewHolder,

@Override 
public void onBindViewHolder(final ViewHolder holder, final int position) { 
    if(array.get(position)){ 
     holder.mainlayout.setBackgroundColor(Color.parseColor("#e927a4d1")); 
    }else{ 
     holder.mainlayout.setBackgroundColor(UNSELECTEDCOLOR); 
    } 
} 
+0

Vielleicht können viele Elemente angeklickt werden, so dass nur 'mItemSelected' nicht ausreicht. – CoXier

+0

Verwenden Sie dann SparseBoolean Array.Überprüfen Sie den aktualisierten Code. – Anonymous

+0

Ich habe deine Logik. danke –

Verwandte Themen