Android 带有ListAdapter的RecyclerView

Android 带有ListAdapter的RecyclerView,android,kotlin,android-recyclerview,listadapter,Android,Kotlin,Android Recyclerview,Listadapter,我正在尝试将我的适配器转换为ListAdapter,以便将来包含分页库。 我的应用程序是一个基本的2片段notes应用程序,第一个片段具有recycler视图,第二个片段具有EditText以将文本插入recycler视图。 我已经实现了所有功能,由于某些原因,在调用submitList后,我的recyclerview不会显示任何内容。。 我用适配器列表观察我的livedata列表,我的livedata列表从房间数据库中获取数据,我将数据查询到其中。在我将适配器转换为ListAdapter之前,

我正在尝试将我的适配器转换为ListAdapter,以便将来包含分页库。 我的应用程序是一个基本的2片段notes应用程序,第一个片段具有recycler视图,第二个片段具有EditText以将文本插入recycler视图。 我已经实现了所有功能,由于某些原因,在调用submitList后,我的recyclerview不会显示任何内容。。 我用适配器列表观察我的livedata列表,我的livedata列表从房间数据库中获取数据,我将数据查询到其中。在我将适配器转换为ListAdapter之前,一切正常

有什么建议吗

我的适配器类:

package com.example.mvvm_example

import android.content.Context
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.example.mvvm_example.db.Word

interface OnItemClickListener : View.OnClickListener {
    override fun onClick(v: View?) {
    }
}

class ListAdapterCallBack : DiffUtil.ItemCallback<Word>() {
    override fun areItemsTheSame(oldItem: Word, newItem: Word): Boolean {
        return oldItem.mWord == newItem.mWord
    }

    override fun areContentsTheSame(oldItem: Word, newItem: Word): Boolean {
        return oldItem == newItem
    }
}

class WordAdapter(
    private val context: Context,
    private val onItemClickListener: OnItemClickListener
) :
    ListAdapter<Word, WordAdapter.WordViewHolder>(ListAdapterCallBack()) {
    private var wordList = listOf<Word>()

    class WordViewHolder(private val view: View) : RecyclerView.ViewHolder(view) {
        private val textView = view.findViewById<TextView>(R.id.textView)!!

        fun onBind(listener: OnItemClickListener, word: Word) {
            textView.text = word.getmWord()
            view.setOnClickListener {
                listener.onClick(view)
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WordViewHolder {
        val inflater = LayoutInflater.from(context)
        return WordViewHolder(inflater.inflate(R.layout.recyclerview_item, parent, false))
    }

    override fun getItemCount(): Int {
        return wordList.size
    }

    fun setWords(list: MutableList<Word>) {
        wordList = list
        notifyDataSetChanged()
    }

    override fun submitList(list: MutableList<Word>?) {
        Log.d("Adapter", "list sumbitted list is ${list.toString()}")
        super.submitList(list?.let { ArrayList(it) })
    }

    override fun onBindViewHolder(holder: WordViewHolder, position: Int) {
        val word = wordList[position]
        holder.onBind(onItemClickListener, word)

    }
}
编辑
如果我将adapter.submitlist与adapter.setwords切换,它也可以工作。。所以,如果您使用ListAdapter,那么submitList方法肯定有问题,这意味着它自己管理列表项。您应该删除getItemCount方法中的单词列表。对于仅访问数据,请调用getItemposition方法。无需重写方法submitList

如果使用ListAdapter,则表示它自己管理列表项。您应该删除getItemCount方法中的单词列表。对于仅访问数据,请调用getItemposition方法。无需覆盖方法提交列表

我爱你,伙计!帮我解决了。我查看了这个星球上的所有线程,但没有一个解决了我的问题。。我想应该很明显我爱你,伙计!帮我解决了。我查看了这个星球上的所有线程,但没有一个解决了我的问题。。我想这应该是显而易见的
package com.example.mvvm_example

import android.app.Activity
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.Toast
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.ViewModelProviders
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.mvvm_example.db.Word
import kotlinx.android.synthetic.main.fragment_first.*

private const val TAG = "firstFrag"

class FirstFragment : Fragment() {
    private lateinit var viewModel: AppViewModel

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        Log.d(TAG, "onCreateView called")
        return inflater.inflate(R.layout.fragment_first, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        Log.d(TAG, "onActivityCreated called")
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProviders.of(this).get(AppViewModel::class.java)

        val recyclerView = requireActivity().findViewById<RecyclerView>(R.id.recyclerview)
        val adapter =
            WordAdapter(requireActivity().applicationContext, object : OnItemClickListener {
                override fun onClick(v: View?) {
                    super.onClick(v)
                    Toast.makeText(
                        requireActivity().applicationContext,
                        "item clicked",
                        Toast.LENGTH_SHORT
                    ).show()
                }
            })

        recyclerView.adapter = adapter
        recyclerView.layoutManager = LinearLayoutManager(requireContext())
        viewModel.getAllWords().observe(requireActivity(), Observer {
            adapter.submitList(it)
        })
        fab.setOnClickListener {
            findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment)
        }

        delfab.setOnClickListener {
            viewModel.deleteAllWords()
            Toast.makeText(requireContext(), "Words Deleted", Toast.LENGTH_LONG).show()
        }

    }
}
package com.example.mvvm_example.db

import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import org.jetbrains.annotations.NotNull


@Entity(tableName = "word_table")
data class Word(

    @ColumnInfo(name = "word")
    @PrimaryKey
    @NotNull
     val mWord: String
) {


    fun getmWord() = mWord
}