Как удалить предметы из Recycler View из другого класса? - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть Recycler View внутри Bottom Sheet, и если щелкнуть по элементу, он будет показан во фрагменте.

Внутри моего фрагмента у меня есть кнопка удаления (для удаления элемента). Как позвонить list.remove(position);?

Метод кнопки удаления:

buttonDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (view == buttonDelete){
                    switchCardAdapter.deleteMethod(1);
                }
            }
        });

1 только фиктивная позиция, как получить реальную позицию из адаптера?

Метод удаления внутри адаптера:

public void deleteMethod(int position) {
        cards.remove(position);
    }

Полный метод BindViewHolder:

@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int 
position) {
       final Card card = cards.get(position); 
       holder.textNumber.setText(String.valueOf(card.getNumberCard()));
       holder.textName.setText(card.getName());
       holder.itemView.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view) {
                Bundle b = new Bundle();
                b.putString("name", card.getName());
                b.putString("description", card.getDescripton());
                b.putString("type", card.getType());
                b.putLong("numberCard", card.getNumberCard());
                b.putInt("cvv",card.getCvv());
                b.putInt("exp", card.getExp());
                b.putInt("pin", card.getPin());
                cardFragment.setDataCard(b);
                bottomSheetFragment.dismiss();
        }
    });
}

public void deleteMethod(int position) {
    cards.remove(position);
}

Любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 30 сентября 2019
public void deleteMethod(int position) {
        cards.remove(position);
        adapter.notifyItemRemoved(position)
    }

Насколько я понимаю, ваш код должен выглядеть примерно так:

Из одного фрагмента у вас открыт 1 нижний лист, содержащий элементы RV. Теперь, когда пользователь нажимает на элемент RV, вы открываете Новый фрагмент из «Фрагмента карты» и закрываете нижний лист. В новом фрагменте вы передали данные пакета. Во фрагменте карты у вас есть кнопка удаления, которая удалит элемент из списка карт.

Итак, используя фрагмент вашей карты с помощью интерфейса, вы должны уведомить свой первый фрагмент с того места, где вы открыли нижний лист. В этом фрагменте вы должны удалить этот конкретный элемент из списка для карт. (Вы должны передать позицию от фрагмента карты до первого фрагмента, чтобы удалить из списка).

Теперь список ваших карт обновлен. Вы можете снова открыть нижний лист с новым обновленным списком. (ранее в onbindViewHolder вы уволили).

0 голосов
/ 30 сентября 2019

Ваш adapter должен быть уведомлен, когда происходят изменения с его источником данных, как в

public void deleteMethod(int position) {
    cards.remove(position);
    notifyDataSetChanged();
}

или более эффективном

public void deleteMethod(int position) {
        cards.remove(position);
        notifyItemRemoved(position);
        //enables smooth animations and also updates data
        notifyItemRangeChanged(position, getItemCount());
}

Когда вы нажимаете на элемент, передаете позицию в связке ииспользуйте его в фрагменте карты, чтобы удалить его

            b.putInt("position", position);//add this
            cardFragment.setDataCard(b);
            bottomSheetFragment.dismiss();

, затем нажмите кнопку onclick,

buttonDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (view == buttonDelete){
                    switchCardAdapter.deleteMethod(bundle.getInt("position));
                }
            }
        });
...