Создайте интерфейс IShoppingCart
, который будет реализован вашим Fragment
. Мы хотим сохранить логику c в Fragment
. (Лично я переместил бы эту логику c в ViewModel
, но это будет касаться.)
IShoppingCart
interface IShoppingCart {
fun addItemToCart(item: CartItem): Boolean
fun removeItemToCart(itemId: String): Boolean
/**
* Feel free to add more functionality
*/
}
Теперь пройдем ваш фрагмент через композицию для вашего RecyclerViewAdapter.
RecyclerViewAdapter
ShoppingCartAdapter(val contract: IShoppingCart) : RecyclerView.Adapter<ViewHolder>() {
.
.
.
}
Теперь вы можете использовать эту ссылку в своем классе ViewHolder
, поскольку они, вероятно, определены как Inner Classes.
ViewHolder
holder.removeProduct.setOnClickListener(v -> {
// This will kick in the code that lies in the Fragment
contract.removeItemToCart(viewHolder.itemView.id)
});
Теперь в вашем Fragment
, внутри removeItemToCart(val itemId)
, просто удалите item
с заданным itemId
и вызовом notifyDataSetChanged()
.
Фрагмент
fun DeleteItemToCart(itemId: String) {
dataset.removeItemWithItemId(itemId)
notifyDataSetChanged()
}
Следуя этому подходу, вам не нужно уведомлять адаптер, что весь набор данных изменился, как это не было. Вы можете просто сказать адаптеру, что изменилось только положение одного элемента (как оно было удалено), используя notifyItemRemoved(position: Int)
.