gpt4 book ai didi

android - RecyclerView 与 ListAdapter

转载 作者:行者123 更新时间:2023-12-02 13:29:53 29 4
gpt4 key购买 nike

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

}
}

我的第一个包含回收 View 的 fragment :

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.setWords(it) 切换 adapter.submitList(it) 它也可以工作..所以它一定是 submitList() 有问题 方法

最佳答案

如果您使用 ListAdapter,则意味着它自己管理列表项。您应该删除内部的 wordList 和方法 getItemCount。对于访问数据,仅调用 getItem(position) 方法。无需覆盖方法 submitList

关于android - RecyclerView 与 ListAdapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62043754/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com