Ich habe eine Recyclerview von Kreditkarten, wenn Sie auf einen klicken Ich möchte es die Hintergrundressource von diesem ändern und alle anderen zurück auf Standard setzen, aus irgendeinem Grund Ich habe das seit ungefähr 5 Stunden gekämpft und kann es nicht richtig machen. HierRecyclerview, auf Klick Highlight und andere nicht hervorgehoben
ist die andernfalls Klasse
public class CheckOutCardRecycler extends RecyclerView.Adapter<CheckOutCardRecycler.CardViewHolder>{
private List<Card> checkOutCard;
private int screenWidth;
private int selected;
public CheckOutCardRecycler(Activity activity, List<Card> checkOutCard){
Display display = activity.getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
this.screenWidth = size.x;
this.checkOutCard = checkOutCard;
selected=-1;
}
public static class CardViewHolder extends RecyclerView.ViewHolder {
CardView card;
LinearLayout row;
static TextView etCardNumber;
static TextView etName;
static TextView etDate;
static LinearLayout creditCard;
CardViewHolder(View itemView) {
super(itemView);
card = (CardView)itemView.findViewById(R.id.card_view);
etCardNumber = (TextView)itemView.findViewById(R.id.etCardNumber);
etName = (TextView)itemView.findViewById(R.id.etName);
etDate = (TextView)itemView.findViewById(R.id.etDate);
creditCard = (LinearLayout) itemView.findViewById(R.id.creditCard);
}
}
@Override
public int getItemCount() {
return checkOutCard.size();
}
public int getSelected() {
return selected;
}
public int getPaymentMethod(int i) {
return Integer.parseInt(checkOutCard.get(i).getId());
}
@Override
public CardViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_checkout_cards, viewGroup, false);
CardViewHolder pvh = new CardViewHolder(v);
return pvh;
}
@Override
public void onBindViewHolder(final CardViewHolder cardViewHolder, final int i) {
CardViewHolder.etCardNumber.setText("**** **** **** " + checkOutCard.get(i).getLast_four_digits());
CardViewHolder.etName.setText(checkOutCard.get(i).getName());
CardViewHolder.etDate.setText(checkOutCard.get(i).getExpiry_month() +"/"+checkOutCard.get(i).getExpiry_year().substring(2,4));
if (selected<0)
if (checkOutCard.get(i).getDefaultcard()==1){
selected=i;
}
CardViewHolder.creditCard.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if (i!=selected) {
checkOutCard.get(selected).setDefaultcard(0);
checkOutCard.get(i).setDefaultcard(1);
selected=-1;
notifyDataSetChanged();
}
}
});
if (selected==i){
if (checkOutCard.get(i).getBrand().toLowerCase().equals("visa"))
CardViewHolder.creditCard.setBackgroundResource(R.drawable.paymentscreenvisaselected);
else if (checkOutCard.get(i).getBrand().toLowerCase().equals("mastercard"))
CardViewHolder.creditCard.setBackgroundResource(R.drawable.paymentscreenmastercardselected);
else
CardViewHolder.creditCard.setBackgroundResource(R.drawable.paymentscreenselected);
}
else {
if (checkOutCard.get(i).getBrand().toLowerCase().equals("visa"))
CardViewHolder.creditCard.setBackgroundResource(R.drawable.paymentscreenvisa);
else if (checkOutCard.get(i).getBrand().toLowerCase().equals("mastercard"))
CardViewHolder.creditCard.setBackgroundResource(R.drawable.paymentscreenmastercard);
else
CardViewHolder.creditCard.setBackgroundResource(R.drawable.paymentscreen);
}
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
}
können Sie mehr als eine auf einmal markieren? – JCDecary
Nein, nur einer. Es ist im Wesentlichen die ausgewählte Karte –
Versuchen Sie nicht, clicklisteners in onBindViewHolder anzuhängen, wenn Sie dasselbe in dem ViewHolder-Konstruktor tun können. Auf diese Weise müssen Sie nicht weiterhin einen Listener anhängen, während der Benutzer scrollt. Ich habe in der Antwort eine funktionierende Lösung hinzugefügt. Ich hoffe, Sie finden es nützlich. – user1841702