Я пытаюсь преобразовать свой адаптер в ListAdapter, чтобы в будущем включить библиотеку подкачки. Мое приложение - это приложение для заметок с фрагментами basi c 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)
}
}
мой первый фрагмент, содержащий 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()
}
}
}
мой класс данных 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
}
РЕДАКТИРОВАТЬ если я переключаю adapter.submitList(it)
на adapter.setWords(it)
, он также работает ... так что с этим что-то не так submitList()
метод