RecyclerView 与 ListAdapter

Yar*_*rit 2 android listadapter kotlin android-recyclerview

我正在尝试将我的适配器转换为 ListAdapter,以便将来包含分页库。我的应用程序是一个基本的 2 片段笔记应用程序,第一个片段具有回收器视图,第二个片段具有用于将文本插入回收器视图的 EditText。我已经实现了所有内容,由于某种原因,我的 recyclerview 在调用 SubmitList() 后没有显示任何内容。我用适配器列表观察我的实时数据列表,并且我的实时数据列表正在从我查询数据的房间数据库中获取数据。在我将适配器转换为 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)

    }
}
Run Code Online (Sandbox Code Playgroud)

我的第一个片段包含 recyclerview :

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()
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

我的Word数据类:

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
}
Run Code Online (Sandbox Code Playgroud)

编辑 如果我 adapter.submitList(it)用它切换也可以..所以该方法adapter.setWords(it)一定有问题submitList()

Côn*_*Hải 6

如果您使用ListAdapter它意味着它本身管理列表项。你应该删除你的wordListinside 和 method getItemCount。对于访问数据仅调用getItem(position)方法。无需重写方法submitList