【问题标题】:Type mismatch. Required: Context Found: In Fragment类型不匹配。必需:找到的上下文:在片段中
【发布时间】:2020-11-08 17:39:19
【问题描述】:

在我的SearchFragment.kt 我有:

private lateinit var userDb: FirebaseFirestore
private lateinit var users: MutableList<User>
private lateinit var adapter: UsersAdapters

fun getUsers() {
    users = mutableListOf()
    adapter = UsersAdapters(this, users)

    userDb = FirebaseFirestore.getInstance()
    val userReference = userDb.collection("users")
    userReference.addSnapshotListener { snapshot, exception ->
        if (exception != null || snapshot == null) {
            Log.i("TAG", "Somethings Wrong", exception)
            return@addSnapshotListener
        }
        val userList = snapshot.toObjects(User::class.java)
        for (user in userList) {
            Log.i("TAG", "Document ${user.username}")
        }
    }
}

onViewCreated 中被调用

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    getUsers()
}

我的UserAdapter.kt 看起来像:

package com.example.myapp

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.item_user.view.*

import com.example.myapp.models.User


class UsersAdapters (val context: Context, val users: List<User>) :
    RecyclerView.Adapter<UsersAdapters.ViewHolder>() {

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

override fun getItemCount() = users.size

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    holder.bind(users[position])
}

inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    fun bind(user: User) {
        itemView.etUsername.text = user?.username
        Glide.with(context).load(user.profileURL).into(itemView.profileImage)
    }
}
}

SearchFragment.kt 的下面一行:

adapter = UsersAdapters(this, users)

我收到以下错误:

Type mismatch.
Required:
Context
Found:
SearchFragment

【问题讨论】:

    标签: android kotlin


    【解决方案1】:
    1. 不要将上下文传递给适配器。删除它,你不需要它。

    2. 膨胀视图时,请使用parent.context 而不是外部上下文。您还可以内联该 return 语句,例如。

      return LayoutInflater.from(parent.context).inflate(R.layout.item_user, parent, false)

    3. 您在 ViewHolder 类中使用 Glide,

    替换

    Glide.with(context).load(user.profileURL).into(itemView.profileImage)
    

    Glide.with(itemView).load(user.profileURL).into(itemView.profileImage)
    

    Glide 会将视图作为参数。这行得通,而且是编写代码的正确方法。

    【讨论】:

      【解决方案2】:

      试试这个:

      adapter = UsersAdapters(requireActivity(), users)
      

      【讨论】:

      • @GurmukhSingh:如果这解决了您的问题,请务必将其标记为已接受的答案。 (当然,假设它是所提供的解决方案中最有用的。)
      • 这不仅仅是一个可行的解决方案。我投了反对票。即使可行,这也不是正确的解决方案。请参阅我的答案中的详细信息。
      【解决方案3】:

      就我而言

      class ModeradorFragment: Fragment() {
      override fun onAttach(context: Context) {
          Log.d(Constraints.TAG, "onAttach")
          super.onAttach(context)
      }
      

      我把 on attach 放在课程的开头 然后在我的线性布局中使用它

      val layoutManager1 = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
      val adapterpreg = PreguntasAdapter(this@ModeradorFragment, data)
      

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多