Перенаправить на другой фрагмент, когда массив пуст в представлении переработчика - PullRequest
0 голосов
/ 08 ноября 2018

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

Это мой адаптер:

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))}
                    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...