Android FireBase和LiveData在cardviews中显示文本;不显示并且内容不';t更新(我可以看到卡片,但没有内容)
我使用Firebase实时数据库。我有RecycleViewAdapter类,一个显示recycleview的片段,一个向片段提供数据的ViewHolder类(我使用LiveData),还有一个与firebase数据库通信的Repository类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
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();
}