永远不会调用android Mvvm适配器

时间:2019-06-11 15:52:03

标签: android kotlin

我开始使用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 个答案:

答案 0 :(得分:1)

我认为您需要将适配器分配给RecyclerView。 试试这个:

binding.resultList.adapter = viewModel.adapter

相关问题