Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 在片段中使用recyclerView显示内容_Kotlin_Android Fragments - Fatal编程技术网

Kotlin 在片段中使用recyclerView显示内容

Kotlin 在片段中使用recyclerView显示内容,kotlin,android-fragments,Kotlin,Android Fragments,我试图将Firebase中的帖子显示在片段中的recyclerView中。如果我在一个“活动”中有以下代码,它就可以工作,但是如果我想在一个片段中有它,“Post Adapter”活动和片段文件会抱怨“context” XML文件是正确构建的,因为如果我在活动中有代码,它会按预期显示帖子。所以问题来自其中一个文件 片段: package com.giveandshareauth.Fragments import android.content.Intent import android.net

我试图将Firebase中的帖子显示在片段中的recyclerView中。如果我在一个“活动”中有以下代码,它就可以工作,但是如果我想在一个片段中有它,“Post Adapter”活动和片段文件会抱怨“context”

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}")
            }
        }



}

}
package com.giveandshareauth.Fragments
导入android.content.Intent
导入android.net.Uri
导入android.os.Bundle
导入android.view.LayoutInflater
导入android.view.view
导入android.view.ViewGroup
导入android.widget.Button
导入android.widget.Toast
导入androidx.fragment.app.fragment
导入com.giveandshareauth.LoginActivity
导入com.giveandshareauth.PostActivity
导入com.giveandshareauth.PostAdapter
导入com.giveandshareauth.R
导入com.giveandshareauth.models.Post
导入com.google.firebase.database.FirebaseDatabase
导入com.google.firebase.firestore.FirebaseFirestore
导入com.google.firebase.storage.StorageReference
导入kotlinx.android.synthetic.main.fragment\u帐户*
将kotlinx.android.synthetic.main.fragment\u导入主页*
导入android.util.Log
导入androidx.recyclerview.widget.LinearLayoutManager
将kotlinx.android.synthetic.main.fragment\u导入主页*
private const val TAG=“PostActivity”
类HomeFragment:Fragment(){
私有lateinit var firestoreDB:FirebaseFirestore//lateinit,因为它将在OnCreate方法中初始化,并且永远不会被知道
私有lateinit var posts:MutableList
lateinit var文件路径:Uri
私有变量imageUri:Uri?=null
私有变量storagePostImages:StorageReference?=null
private var database=FirebaseDatabase.getInstance().reference
专用lateinit变量适配器:PostAdapter
覆盖创建视图(
充气机,
容器:视图组?,
savedInstanceState:捆绑?
):视图?=充气机。充气(R.layout.fragment\u home,container,false)
覆盖已创建的视图(视图:视图,保存状态:捆绑?){
super.onViewCreated(视图,savedInstanceState)
//布局文件
//数据源
posts=mutableListOf()
//适配器
adapter=PostAdapter(getActivity().context,posts)
//绑定适配器和布局
postsList.adapter=适配器
postsList.layoutManager=LinearLayoutManager(getActivity().context)
firestoreDB=FirebaseFirestore.getInstance()
val postsRef=firestoreDB
.收集(“员额”)
.limit(10)//显示最后10篇文章
.orderBy(“post_time”,com.google.firebase.firestore.Query.Direction.DESCENDING)
postsRef.addSnapshotListener{快照,异常->
如果(异常!=null | |快照==null){
Log.e(com.giveandshareauth.TAG,“查询帖子时出现异常”,异常)
return@addSnapshotListener
}
val postList=snapshot.toObjects(Post::class.java)
posts.clear()
posts.addAll(postList)
adapter.notifyDataSetChanged()
for(在postList中发布){
Log.i(com.giveandshareauth.TAG,“Post${Post}”)
}
}
}
}
邮政适配器:

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)
        }

    }


}
package com.giveandshareauth
导入android.text.format.DateUtils
导入android.view.LayoutInflater
导入android.view.view
导入android.view.ViewGroup
导入androidx.recyclerview.widget.recyclerview
导入com.bumptech.glide.glide
导入com.giveandshareauth.Fragments.HomeFragment
导入com.giveandshareauth.models.Post
导入kotlinx.android.synthetic.main.item.view*
类PostAdapter(val上下文:HomeFragment,val posts:List):
RecyclerView.Adapter(){
override onCreateViewHolder(父级:ViewGroup,viewType:Int):ViewHolder{
val view=LayoutInflater.from(上下文)。充气(R.layout.item,父项,false)
返回视图保持器(视图)
}
重写getItemCount()=posts.size
覆盖BindViewHolder(holder:ViewHolder,位置:Int){
固定器绑定(柱[位置])
}
内部类ViewHolder(itemView:View):RecyclerView.ViewHolder(itemView){
趣味绑定(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)
    }

使用
requirectivity()[notnull]或
活动?
[nullable]而不是
有效,非常感谢!我将上下文保存在适配器构造函数中。对于片段,我将上下文设置为“活动”。但一切都按计划进行。非常感谢。