程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了recyclerView 片段错误(上下文)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决recyclerView 片段错误(上下文)?

开发过程中遇到recyclerView 片段错误(上下文)的问题如何解决?下面主要结合日常开发的经验,给出你关于recyclerView 片段错误(上下文)的解决方法建议,希望对你解决recyclerView 片段错误(上下文)有所启发或帮助;

我将 Kotlin 与 SDK 版本 29 一起使用。 我在几个网站上搜索过,但@R_262_10739@关于这个主题的任何内容。 我想使用适配器在我的片段中使用 recyclervIEw,但有一个关于我的适配器的错误,我无法解决。

这里是错误:

类型不匹配:推断的类型是 Flux 但需要上下文

它来自片段的下一行:

adapter = postsAdapter(this,posts)

你知道如何设置上下文吗?

这是我的代码:

适配器:

导入:

import androID.content.Context 
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.example.givenaskv1.R
import kotlinx.androID.synthetic.main.item_post.vIEw.*

代码:

class postsAdapter (val context: Context,val posts : List<Post>) :
    RecyclerVIEw.Adapter<postsAdapter.VIEwHolder>() {
    overrIDe fun onCreateVIEwHolder(parent: VIEwGroup,vIEwType: int): VIEwHolder {
        val vIEw = LayoutInflater.from(context).inflate(R.layout.item_post,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.tvUser@R_502_6889@.text = post.user?.first@R_502_6889@
            itemVIEw.tvDescription.text = post.description
            GlIDe.with(context).load(post.imageUrl).into(itemVIEw.ivPost)
            itemVIEw.tvrelativeTime.text = DateUtils.getrelativeTimeSpanString(post.creationTimeMs)
        }
    }
}
 

片段:

导入:

import androID.os.bundle
import androID.util.Log
import androID.vIEw.LayoutInflater
import androID.vIEw.VIEw
import androID.vIEw.VIEwGroup
import androIDx.fragment.app.Fragment
import androIDx.recyclervIEw.Widget.linearlayoutmanager
import com.example.givenaskv1.R
import com.example.givenaskv1.models.Post
import com.example.givenaskv1.models.postsAdapter
import com.Google.firebase.firestore.FirebaseFirestore
import com.Google.firebase.firestore.query
import kotlinx.androID.synthetic.main.fragment_flux.*

代码:

private const val TAG = "Flux"
class Flux : Fragment() {

    private lateinit var firestoreDb : FirebaseFirestore
    private lateinit var posts : MutableList<Post>
    private lateinit var adapter: postsAdapter

    overrIDe fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceStatE)


    posts = mutablelistof()
    adapter = postsAdapter(this,posts)  <----- HERE IS THE ERROR
    rvposts.adapter = adapter
    rvposts.layoutManager = linearlayoutmanager(this.context)


    firestoreDb = FirebaseFirestore.geTinstance()
    val postsReference = firestoreDb.collection("post")
        // .limit() indique le nombre de post MAXIMIM a afficher en même temps,pour éviter le lagg
        .limit(20)
        // .orderBy() filtre selon le critère choisi (ici par ordre chonologiquE)
        .orderBy("creation_time_ms",query.Direction.DESCENDING)

    postsReference.addSnapshotListener{ snapshot,exception ->

        if (exception != null || snapshot == null) {
            Log.e(tag,"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(tag,"Post ${post}")
        }
    }
    }

    overrIDe fun onCreateVIEw(
        inflater: LayoutInflater,container: VIEwGroup?,savedInstanceState: Bundle?
    ): VIEw? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_flux,container,falsE)
    }
}

fragment.xml

<?xml version="1.0" enCoding="utf-8"?>
<linearLayout xmlns:androID="http://scheR_508_11845@as.androID.com/apk/res/androID"
    xmlns:app="http://scheR_508_11845@as.androID.com/apk/res-auto"
    xmlns:tools="http://scheR_508_11845@as.androID.com/tools"
    androID:layout_wIDth="match_parent"
    androID:layout_height="match_parent"
    androID:orIEntation="vertical"
    tools:context=".Flux.Flux">

    <androIDx.recyclervIEw.Widget.RecyclerVIEw
        androID:ID="@+ID/rvposts"
        androID:layout_wIDth="match_parent"
        androID:layout_height="match_parent" />

</linearLayout>

当我尝试替换时

adapter = postsAdapter(this,posts)

adapter = postsAdapter(requireContext(),posts)

出现以下错误:

java.lang.IllegalStateException: rvposts 不能为 null

非常感谢!

解决方法

是因为在创建片段视图之前,您在片段 RecyclerView 回调中获得了 onCreate 实例;由于onCreate()回调在onCreateView()回调

之前触发

注意:片段视图由 onCreateView() 创建并返回。

为了解决这个问题,将代码从 onCreate() 转移到 onCreateView()

private const val TAG = "Flux"
class Flux : Fragment() {

    private lateinit var firestoreDb : FirebaseFirestore
    private lateinit var posts : MutableList<Post>
    private lateinit var adapter: PostsAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceStatE)

    }

    override fun onCreateView(
        inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment

        val view = inflater.inflate(R.layout.fragment_flux,container,falsE)

        posts = mutableListOf()
        adapter = PostsAdapter(requireContext(),posts) 
        
        val rvPosts = view.findViewById<RecyclerView>(R.id.rvPosts)
        rvPosts.adapter = adapter
        rvPosts.layoutManager = LinearLayoutManager(this.context)


        firestoreDb = FirebaseFirestore.geTinstance()
        val postsReference = firestoreDb.collection("post")
            // .limit() indique le nombre de post MAXIMIM a afficher en même temps,pour éviter le lagg
            .limit(20)
            // .orderBy() filtre selon le critère choisi (ici par ordre chonologiquE)
            .orderBy("creation_time_ms",Query.Direction.DESCENDING)

        postsReference.addSnapshotListener{ snapshot,exception ->

        if (exception != null || snapshot == null) {
            Log.e(tag,"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(tag,"Post ${post}")
        }
        return view
    }
}

大佬总结

以上是大佬教程为你收集整理的recyclerView 片段错误(上下文)全部内容,希望文章能够帮你解决recyclerView 片段错误(上下文)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: