Android FireBase和LiveData在cardviews中显示文本;不显示并且内容不';t更新(我可以看到卡片,但没有内容)

Android FireBase和LiveData在cardviews中显示文本;不显示并且内容不';t更新(我可以看到卡片,但没有内容),android,firebase,firebase-realtime-database,android-livedata,Android,Firebase,Firebase Realtime Database,Android Livedata,我使用Firebase实时数据库。我有RecycleViewAdapter类,一个显示recycleview的片段,一个向片段提供数据的ViewHolder类(我使用LiveData),还有一个与firebase数据库通信的Repository类 class Post( var title: String = "", var dateStr: String = "", var desc: String = "", var id: Str

我使用Firebase实时数据库。我有RecycleViewAdapter类,一个显示recycleview的片段,一个向片段提供数据的ViewHolder类(我使用LiveData),还有一个与firebase数据库通信的Repository类

class Post(
var title: String = "",
var dateStr: String = "",
var desc: String = "",
var id: String = "")
类PostsFireBaseRepository(val bucketListViewModel:bucketListViewModel){

BucketlisterRecycleServiceAdapter

class BucketListRecyclerViewAdapter() : RecyclerView.Adapter<BucketListRecyclerViewAdapter.ViewHolder>() {

interface PostItemClickListener {
    fun onItemLongClick(position: Int, view: View, post: Post?): Boolean
    fun onItemClick(position: Int, view: View, post: Post?): Boolean
}

private var postList = mutableListOf<Post>()

private var lastDeleted: Post? = null
private var lastDeletedPos: Int? = null

var postClickListener: PostItemClickListener? = null

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

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val post = postList[holder.adapterPosition]

    holder.post = post

    holder.tvTitle.text = post.title
    holder.tvDesc.text = post.desc
    holder.tvRowDate.text = post.dateStr
}

override fun getItemCount() = postList.size

fun addItem(post: Post) {
    postList.add(post)
    notifyItemInserted(postList.size-1)
}

fun addAll(posts: List<Post>) {
    postList.clear()
    postList.addAll(posts)
    notifyDataSetChanged()
}
类BucketListRecycleServiceAdapter():RecyclerView.Adapter(){
界面PostItemClickListener{
单击鼠标右键(位置:Int,视图:view,post:post?):布尔值
单击(位置:Int,视图:view,post:post?):布尔值
}
private var postList=mutableListOf()
私有变量lastDeleted:Post?=null
私有变量lastDeletedPos:Int?=null
var postClickListener:PostItemClickListener?=null
override onCreateViewHolder(父级:ViewGroup,viewType:Int):ViewHolder{
val view=LayoutInflater.from(parent.context).充气(R.layout.bucketlist_post_行,parent,false)
返回视图保持器(视图)
}
覆盖BindViewHolder(holder:ViewHolder,位置:Int){
val post=postList[持有者适配器位置]
holder.post=post
holder.tvTitle.text=post.title
holder.tvDesc.text=post.desc
holder.tvRowDate.text=post.dateStr
}
重写getItemCount()=postList.size
趣味附加项(post:post){
postList.add(post)
notifyItemInserted(postList.size-1)
}
fun addAll(帖子:列表){
postList.clear()
postList.addAll(posts)
notifyDataSetChanged()
}


在您的
onDataChange
方法中,您需要通知该适配器其数据已更改,否则它将不会重新绘制UI元素。为此,请在更新该适配器的数据源后,在适配器上调用
notifyDataSetChanged()

比如:

override fun onDataChange(dataSnapshot: DataSnapshot) {
    for (ds in dataSnapshot.children) {
        val newPost = dataSnapshot.getValue<Post>(Post::class.java)
        if (newPost != null) {
            data.add(newPost)
        }
    }
    bucketListViewModel.allPosts.value = data
    adapter.notifyDataSetChanged();        
}
覆盖数据更改(dataSnapshot:dataSnapshot){
for(dataSnapshot.children中的ds){
val newPost=dataSnapshot.getValue(Post::class.java)
if(newPost!=null){
data.add(newPost)
}
}
bucketListViewModel.allPosts.value=数据
adapter.notifyDataSetChanged();
}

具体如何到达适配器取决于您的代码。例如,在您的情况下,您可能需要向
BucketListViewModel
添加一个方法,从
onDataChange
调用该方法,然后调用适配器。

请同时添加
Post
clas的内容。我编辑了该帖子。谢谢您的回答。我尝试了这个但不幸的是,它对我不起作用。也许我的代码有其他问题。我用更改编辑了代码。我在帖子中添加了recycleview适配器类,在这里我还调用了notifyDataSetChanged函数。
class BucketListFragment : Fragment(), DatePickerDialogFragment.OnDateSelectedListener,
BucketListRecyclerViewAdapter.PostItemClickListener {

private lateinit var bucketListViewModel: BucketListViewModel

private lateinit var recyclerViewAdapter: BucketListRecyclerViewAdapter

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
): View? {
    return inflater.inflate(R.layout.fragment_bucketlist, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    setupRecyclerView()

    bucketListViewModel = ViewModelProvider(requireActivity()).get(BucketListViewModel::class.java)
    bucketListViewModel.allPosts.observe(viewLifecycleOwner) { posts ->
        recyclerViewAdapter.addAll(posts)
    }

}
class BucketListRecyclerViewAdapter() : RecyclerView.Adapter<BucketListRecyclerViewAdapter.ViewHolder>() {

interface PostItemClickListener {
    fun onItemLongClick(position: Int, view: View, post: Post?): Boolean
    fun onItemClick(position: Int, view: View, post: Post?): Boolean
}

private var postList = mutableListOf<Post>()

private var lastDeleted: Post? = null
private var lastDeletedPos: Int? = null

var postClickListener: PostItemClickListener? = null

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

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val post = postList[holder.adapterPosition]

    holder.post = post

    holder.tvTitle.text = post.title
    holder.tvDesc.text = post.desc
    holder.tvRowDate.text = post.dateStr
}

override fun getItemCount() = postList.size

fun addItem(post: Post) {
    postList.add(post)
    notifyItemInserted(postList.size-1)
}

fun addAll(posts: List<Post>) {
    postList.clear()
    postList.addAll(posts)
    notifyDataSetChanged()
}
override fun onDataChange(dataSnapshot: DataSnapshot) {
    for (ds in dataSnapshot.children) {
        val newPost = dataSnapshot.getValue<Post>(Post::class.java)
        if (newPost != null) {
            data.add(newPost)
        }
    }
    bucketListViewModel.allPosts.value = data
    adapter.notifyDataSetChanged();        
}