У меня есть адаптер с держателем вида, который обрабатывает привязку данных. Я хочу, чтобы иметь возможность перенаправить пользователя на другую страницу (сделать фрагмент пересылки на фрагмент ошибки), если массив пуст.
Это мой адаптер:
class UserCardsRecyclerViewAdapter(val listener: (Card) -> Unit) : RecyclerView.Adapter<UserCardsRecyclerViewAdapter.ViewHolder>() {
private var cardsList = mutableListOf<Card>()
private var views = mutableListOf<ViewHolder>()
fun addItems(items: List<Card>){
cardsList.addAll(items)
notifyDataSetChanged()
}
fun clear(){
cardsList = mutableListOf()
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(parent.context)
val view = inflater.inflate(R.layout.item_user_card, parent, false)
return ViewHolder(view).also { views.add(it) }
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val card = cardsList[position]
holder.bind(card, listener)
}
override fun getItemCount() = cardsList.size
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(card: Card, listener: (Card) -> Unit) {
if(card.name.isEmpty()){
Toast.makeText(itemView.context,"Empty",Toast.LENGTH_LONG).show()
}
itemView.card_name.text = card.name
itemView.card_number.text = card.number.toString()
card.expiration?.let {
itemView.valid_title.visibility =View.VISIBLE
itemView.valid_date.visibility = View.VISIBLE
itemView.valid_date.text = it.ParseMonthYear()
}
GlideApp.with(itemView.context).load(card.mosaicImageUrl)
.fitCenter()
.apply(RequestOptions.bitmapTransform(
RoundedCornersTransformation(50, 0, RoundedCornersTransformation.CornerType.ALL)))
.into(itemView.card_image)
itemView.setOnClickListener { listener(card) }
}
}
}
Это мой фрагмент, где я называю адаптер:
override fun doOnCreated() {
initCardsRecyclerView()
viewModel.loadCards()
}
private fun initCardsRecyclerView(){
dataBinding.rvCards.setHasFixedSize(true)
dataBinding.rvCards.setItemViewCacheSize(1)
dataBinding.rvCards.isNestedScrollingEnabled = false
dataBinding.rvCards.layoutManager = LinearLayoutManager(context)
userCardsRecyclerViewAdapter = UserCardsRecyclerViewAdapter(::handleCardClickListener)
dataBinding.rvCards.adapter = userCardsRecyclerViewAdapter
viewModel.retrieveCards().observe(this, Observer<List<Card>> {
userCardsRecyclerViewAdapter.apply {
clear()
addItems(it)
}
})
}
Это моя viewModel, которая содержит методы, которые взаимодействуют с хранилищем и API
class CardsViewModel @Inject constructor(
private val cardsRepository: CardsRepository
) : ViewModel() {
private val loading = MutableLiveData<Boolean>()
private val cards = MutableLiveData<List<Card>>()
fun retrieveCards(): LiveData<List<Card>> = cards
fun retrieveLoading(): LiveData<Boolean> = loading
fun loadCards(){
loading.postValue(true)
cardsRepository.getUserCards(
{
cards.postValue(it)
loading.postValue(false)
},
{
loading.postValue(false)
})
}
}
Это мой репозиторий
class CardsRepository @Inject constructor(
private val cardsDao: CardsDao,
private val apiManager: ApiManager
){
fun getUserCards(onSuccess: (List<Card>)->Unit, onError: (Exception)->Unit) =
cardsDao.loadAll()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ composeCardInfo(
it.filterNot {
it.cardState == CardState.Blocked ||
it.cardState == CardState.Deleted
},
onSuccess, onError) },
{onError(Exception(it.message))}
)