recyclerView(上下文)片段中的错误[重复]

Posted

技术标签:

【中文标题】recyclerView(上下文)片段中的错误[重复]【英文标题】:Error in fragment with recyclerView (context) [duplicate] 【发布时间】:2021-07-19 09:39:07 【问题描述】:

我正在使用带有 SDK 版本 29 的 Kotlin。 我在几个网站上进行了搜索,但没有找到关于这个主题的任何内容。 我想使用适配器在我的片段中使用 recyclerview,但是我无法解决关于我的适配器的错误。

这是错误:

类型不匹配:推断类型为 Flux 但预期为 Context

它来自片段的下一行:

适配器 = PostsAdapter(this, 帖子)

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

这是我的代码:

适配器:

进口:

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.tvUsername.text = post.user?.firstName
            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)
    

片段.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:orientation="vertical"
    tools:context=".Flux.Flux">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rvPosts"
        android:layout_
        android:layout_ />

</LinearLayout>

当我尝试替换时

adapter = PostsAdapter(this, posts)

adapter = PostsAdapter(requireContext(), posts)

出现以下错误:

java.lang.IllegalStateException: rvPosts 不能为空

非常感谢!

【问题讨论】:

您需要将adapter = PostsAdapter(this, posts)替换为adapter = PostsAdapter(requireContext(), posts) @Zain 当我尝试这个时出现以下错误:java.lang.IllegalStateException: rvPosts must not be null 也许是因为它是一个片段? 那个空错误是因为视图是在onCreateView中设置的,在onCreate完成之后。这也是另一个问题。 【参考方案1】:

这是因为您在片段视图创建之前在片段onCreate 回调中获得了RecyclerView 实例;因为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
    

【讨论】:

谢谢!现在片段已打开但没有出现?除了一个新错误:E/RecyclerView: No adapter attach;跳过布局,你知道怎么解决吗?再次感谢您 这是另一个错误,您可能会为此打开一个新问题:) 是的,我会的,非常感谢 Zain! ?

以上是关于recyclerView(上下文)片段中的错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Android:RecyclerView 不显示片段中的列表项

使用 Kotlin 在片段中引用 RecyclerView 时出现空指针错误

片段中的Android Studio RecyclerView [重复]

片段中的recyclerview的“RecyclerView:没有附加适配器;跳过布局”[重复]

Kotlin Android Fragment recyclerView 和上下文问题

RecyclerView holder中的Android Google Maps动态片段