Kotlin RecyclerView MVVM 数据未显示

Kotlin RecyclerView MVVM data not showing

我在 MVVM 项目中有一个 RecyclerView。我必须从 editText (searchWordEt) 中获取文本,然后将它传递给调用 API 方法的函数,在 viewmodel.API 中工作正常并且 returns 数据。但是当我在 SearchFragment 中调用 searchDefAdapter.submitList(response) 时没有任何反应并且 RecyclerView 数据没有显示。

class SearchDefAdapter(
    private var infoListener: OnItemClickListener,
    private var addListener: OnItemClickListener
):
    ListAdapter<Def, SearchDefViewHolder>(differCallback) {
    interface OnItemClickListener {
        fun onItemClick(position: Int)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SearchDefViewHolder {
        return SearchDefViewHolder(
            SearchWordCardBinding.inflate(
                LayoutInflater.from(parent.context),
                parent,
                false
            ),
            addListener,
            infoListener
        )
    }

    override fun onBindViewHolder(holder: SearchDefViewHolder, position: Int) {
        holder.bind(getItem(position))
    }
}
class SearchDefViewHolder(
    private val binding: SearchWordCardBinding,
    addListener: SearchDefAdapter.OnItemClickListener,
    infoListener: SearchDefAdapter.OnItemClickListener
): RecyclerView.ViewHolder(binding.root) {
    fun bind(data: Def) {
        with (binding) {
            searchCardTv.text = "${data.text} - ${data.tr[0].text}"
        }
    }

    init {
        binding.addSearchCard.setOnClickListener {
            addListener.onItemClick(adapterPosition)
        }

        binding.infoSearchCard.setOnClickListener {
            infoListener.onItemClick(adapterPosition)
        }
    }
}
val differCallback = object : DiffUtil.ItemCallback<Def>() {
    override fun areItemsTheSame(oldItem: Def, newItem: Def): Boolean {
        return oldItem.text == newItem.text
    }

    override fun areContentsTheSame(oldItem: Def, newItem: Def): Boolean {
        return oldItem == newItem
    }
}
@AndroidEntryPoint
class SearchFragment : Fragment() {
    private var _binding: FragmentSearchBinding? = null
    private val binding get() = _binding!!

    lateinit var searchDefAdapter: SearchDefAdapter
    private val viewModel: DictionaryViewModel by activityViewModels()

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = FragmentSearchBinding.inflate(inflater, container, false)
        val view = binding.root

        searchDefAdapter = SearchDefAdapter(
            object : SearchDefAdapter.OnItemClickListener {
                override fun onItemClick(position: Int) {
                    Log.d("tag", "Item Added!")
                    //viewModel.saveWord(position)
                }
            },
            object : SearchDefAdapter.OnItemClickListener {
                override fun onItemClick(position: Int) {
                    val wordFragment = WordFragment()
                    fragmentManager?.beginTransaction()?.replace(
                        R.id.nav_host_fragment_container,
                        wordFragment
                    )?.commit()
                }
            }
        )

        setUpRecyclerView(searchDefAdapter)

        var job: Job? = null
        binding.searchWordEt.addTextChangedListener { editable ->
            job?.cancel()
            job = MainScope().launch {
                delay(SEARCH_WORD_TIME_DELAY)
                editable?.let {
                    if (editable.toString().isNotEmpty())
                        viewModel.getTranslation(editable.toString())
                }
            }
        }

        viewModel.def.observe(viewLifecycleOwner, Observer { response ->
            binding.apply {
                searchDefAdapter.submitList(response)
            }
        })

        return view
    }

    override fun onDestroyView() {
        _binding = null
        super.onDestroyView()
    }

    private fun setUpRecyclerView(adapter: SearchDefAdapter){
        binding.searchRv.apply {
            adapter
            layoutManager = LinearLayoutManager(activity)
        }
    }
}

您还没有在 setUpRecyclerView()

中实际设置适配器
private fun setUpRecyclerView(myAdapter: SearchDefAdapter){
        binding.searchRv.apply {
            layoutManager = LinearLayoutManager(activity)
            adapter = myAdapter // here
        }
    }