Android Mvvm адаптер никогда не называется - PullRequest
0 голосов
/ 11 июня 2019

Я начинаю использовать архитектуру Mvvm, но у меня проблема с моим адаптером -> Он никогда не вызывался

У меня есть адаптер здесь:

class LocationResultAdapter: RecyclerView.Adapter<LocationResultAdapter.ViewHolder>() {
    private lateinit var resultList:List<ResultSearchBean>

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val binding: ItemPostBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.context), R.layout.item_post, parent, false)
        return ViewHolder(binding)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(resultList[position])
    }

    override fun getItemCount(): Int {
        return if (resultList.isNotEmpty()) {
            resultList.size
        } else {
            0
        }
    }

    fun updateList(list: List<ResultSearchBean>) {
        resultList = list
        notifyDataSetChanged()
    }

    class ViewHolder(private val binding: ItemPostBinding):RecyclerView.ViewHolder(binding.root){
        private val viewModel = LocationViewModel()

        fun bind(resultSearchBean: ResultSearchBean){
            viewModel.bind(resultSearchBean)
            binding.viewModel = viewModel
        }
    }

}

этот адаптер называется в моей ViewModel

class LocationResultViewModel(private val resultSearchDao: ResultSearchDao): BaseViewModel() {

@Inject
lateinit var mFi9Api: Fi9Api

private lateinit var mSubscription: Disposable
var mSearchText: String = ""
val adapter: LocationResultAdapter = LocationResultAdapter()

override fun onCleared() {
    super.onCleared()
    mSubscription.dispose()
}

fun search(searchText: String) {
    resultLocations(searchText)
}

private fun resultLocations(searchText: String) {
    mSearchText = searchText
    mSubscription = mFi9Api.getLocation(mSearchText)
        .flatMap { resource ->
            return@flatMap Observable.fromCallable {
                resultSearchDao.deleteAll()
                resultSearchDao.insertAll(resource.distinctBy { r -> r.label })
            }
        }
        .concatMap {
            return@concatMap resultSearchDao.all()
        }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribeWith(GetLocationListSubscriber())
}

inner class GetLocationListSubscriber : ResourceObserver<List<ResultSearchBean>>() {

    override fun onNext(@NonNull t: List<ResultSearchBean>) {
        adapter.updateList(t)
    }

    override fun onError(@NonNull e: Throwable) {
    }

    override fun onComplete() {
        // Nothing to do
    }

}

В своей деятельности у меня есть следующий код:

    class LocationResultActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    private lateinit var viewModel: LocationResultViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        binding.resultList.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false)

        viewModel = ViewModelProviders.of(this, ViewModelFactory(this)).get(LocationResultViewModel::class.java)
        binding.viewModel = viewModel

        search_btn.setOnClickListener {
            viewModel.search(search_et.text.toString())
        }
    }
}

Вызывается только метод: adapter.updateList (t). Я поставил точку останова на OnCreateViewHolder, OnBindViewHolder, getItemCount, но он никогда не вызывал

Что я сделал, что не работает?

Спасибо за вашу помощь

1 Ответ

1 голос
/ 11 июня 2019

Я думаю, вам нужно назначить свой адаптер для вашего RecyclerView.Попробуйте это:

binding.resultList.adapter = viewModel.adapter

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...