Wątek przeniesiony 2017-10-11 20:11 z Java przez Koziołek.

Zaznaczenie pojedynczej karty w RecycleView

0

Otóż mam pewien problem chodzi o zaznaczanie kart. Pojedyńcza karta zawiera menu. Jedną z opcji jest ustaw kartę jak domyślną,która zaznacza kartę obrabowaniem karty na zielony kolor.
Problem polega na tym że jak zaznaczymy inną kartę to ta karta która była poprzednia karta zaznaczona nie odznacza się

public class CardAdapter extends RecyclerView.Adapter<CardAdapter.CardViewHolder> {

private String nameDecrypt, setDateDecrypt, expirationDateDecrypt, dataString, key;
private List<Card> cardsList = new ArrayList<>();
private ItemClickListener clickListener;

public void setClickListener(ItemClickListener clickListener) {
    this.clickListener = clickListener;
}

public CardAdapter(ArrayList<Card> cardsList, String key) {
    this.key = key;
    this.cardsList = cardsList;
    notifyDataSetChanged();
}

@Override
public CardViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_card, parent, false);
    return new CardViewHolder(view);
}

@Override
public void onBindViewHolder(CardViewHolder holder, final int position) {

    final Card card = cardsList.get(position);
    holder.nameCard.setText(card.getNameCard());
    holder.cardView.setBackgroundResource(R.drawable.bordercardviewwhite);
    holder.setCurrentDateText.setText(card.getCreateDate());
    holder.setExpirationDateText.setText(card.getExpirationDate());
    holder.menu.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            clickListener.onClickMenu(v, position);
        }
    });

    if (card.isSelectedDefault()) {
        holder.cardView.setBackgroundResource(R.drawable.bordercardviewgreen);
    } else {
        holder.cardView.setBackgroundResource(R.drawable.bordercardviewwhite);
    }
}

public void setSelected(int position) {
    if (cardsList.size() > 1) {
        cardsList.get(position).setSelectedDefault(false);
    }

    cardsList.get(position).setSelectedDefault(true);
    notifyDataSetChanged();
}

@Override
public int getItemCount() {
    return cardsList.size();
}

}

model Karty

public class Card {

        private int Id;
      ...
        private boolean isSelectedDefault;

        public boolean isSelectedDefault() {
            return isSelectedDefault;
        }

        public void setSelectedDefault(boolean selectedDefault) {
            isSelectedDefault = selectedDefault;
        }
}

w aktywności dla każdej karty pojawia się menu

public void onClickMenu(View view, final int position) {

    final Card card = cardsList.get(position);

    final PopupMenu popupMenu = new PopupMenu(this, view);
    MenuInflater inflater = popupMenu.getMenuInflater();
    inflater.inflate(R.menu.cardmenu, popupMenu.getMenu());

    popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            switch (item.getItemId()) {
                case R.id.editCard:

                    break;
                case R.id.deleteCard:

                    break;
                case R.id.informationAboutCard:

                    break;
                case R.id.defaultCard:

                    cardAdapter.setSelected(position);
                    break;
            }

            return false;
        }
    });
    popupMenu.show();
}
0

Od jakiegoś czasu w androidzie jest taki mechanizm jak DiffUtilCallback. Jeśli go zaimplementujesz to dostaniesz to z automatu.

1

@magdalena123
po analizie Twojego kodu, wygląda na to, że problem leży w Twoim CardAdapter w metodzie setSelected(int position). Brakuje tam odznaczenia wcześniej zaznaczonej karty.

if (cardsList.size() > 1) {
        cardsList.get(position).setSelectedDefault(false);    // ten fragment kodu odznacza obecnie wybraną kartę (a nie kartę zaznaczoną wcześniej)
}

Najszybszym rozwiązaniem tego problemu będzie przeiterowanie się po liście kart i przestawienie isSelectedDefault na false:

...
public void setSelected(int position) {
    for (Card c: cardsList) {
        c.setSelectedDefault(false);
    }

    cardsList.get(position).setSelectedDefault(true);
    notifyDataSetChanged();
}
...

Minusem tego rozwiązania jest to, że za każdym razem musisz przeiterować się po całej liście.

1 użytkowników online, w tym zalogowanych: 0, gości: 1