在片段中使用recyclerView显示内容



我正试图将Firebase中的帖子显示到Fragment内的recyclerView中。如果我在一个";活动";但如果我想把它放在片段中;接线柱适配器";活动,并且片段文件抱怨";上下文";。

XML文件是正确构建的,因为如果我在"活动"中有代码,它会按预期显示帖子。所以问题来自于其中一个文件。

片段:

package com.giveandshareauth.Fragments
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.Toast
import androidx.fragment.app.Fragment
import com.giveandshareauth.LoginActivity
import com.giveandshareauth.PostActivity
import com.giveandshareauth.PostAdapter
import com.giveandshareauth.R
import com.giveandshareauth.models.Post
import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.firestore.FirebaseFirestore
import com.google.firebase.storage.StorageReference
import kotlinx.android.synthetic.main.fragment_account.*
import kotlinx.android.synthetic.main.fragment_home.*

import android.util.Log
import androidx.recyclerview.widget.LinearLayoutManager

import kotlinx.android.synthetic.main.fragment_home.*
private const val TAG = "PostActivity"
class HomeFragment : Fragment() {
private lateinit var firestoreDB: FirebaseFirestore // lateinit because it will be initialised inside OnCreate method and it should never be known
private lateinit var posts: MutableList<Post>
lateinit var filepath: Uri
private var imageUri: Uri? = null
private var storagePostImages: StorageReference? = null
private var database = FirebaseDatabase.getInstance().reference
private lateinit var adapter: PostAdapter
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? = inflater.inflate(R.layout.fragment_home, container,false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//layout file
//data source
posts = mutableListOf()
//adapter
adapter = PostAdapter(getActivity().context, posts)
//bind the adapter and layout
postsList.adapter = adapter
postsList.layoutManager = LinearLayoutManager(getActivity().context)
firestoreDB = FirebaseFirestore.getInstance()
val postsRef = firestoreDB
.collection("posts")
.limit(10)                      //show last 10 posts
.orderBy("post_time", com.google.firebase.firestore.Query.Direction.DESCENDING)
postsRef.addSnapshotListener { snapshot, exception ->
if (exception != null || snapshot == null) {
Log.e(com.giveandshareauth.TAG, "There is an exception when querying posts", exception)
return@addSnapshotListener
}
val postList = snapshot.toObjects(Post::class.java)
posts.clear()
posts.addAll(postList)
adapter.notifyDataSetChanged()
for (post in postList) {
Log.i(com.giveandshareauth.TAG, "Post ${post}")
}
}

}
}

PostAdaper:

package com.giveandshareauth
import android.text.format.DateUtils
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.giveandshareauth.Fragments.HomeFragment
import com.giveandshareauth.models.Post
import kotlinx.android.synthetic.main.item.view.*
class PostAdapter(val context: HomeFragment, val posts: List<Post>) :
RecyclerView.Adapter<PostAdapter.ViewHolder>(){

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

override fun getItemCount() = posts.size
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(posts[position])
}
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(post: Post) {
itemView.username.text=post.user?.username
itemView.btnDescription.text=post.description
Glide.with(context).load(post.imageUrl).into(itemView.products)
itemView.time.text = DateUtils.getRelativeTimeSpanString(post.postTime)
}
}

}

嗨,我的朋友,你可以从适配器构造函数中删除上下文,并覆盖一些方法,比如这个

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item, parent,false)
return ViewHolder(view)
}
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(post: Post) {
itemView.username.text=post.user?.username
itemView.btnDescription.text=post.description
Glide.with(itemview.context).load(post.imageUrl).into(itemView.products)
itemView.time.text = DateUtils.getRelativeTimeSpanString(post.postTime)
}

最新更新