You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用FirestoreRecyclerAdapter的updateOptions()方法出现类型不匹配错误

错误原因

你给adapter声明类型的时候用了Kotlin星投影<*, *>,星投影下泛型类型的入参位置会被自动推断为Nothing类型,所以你调用updateOptions传入FirestoreRecyclerOptions<Restaurant>类型的参数时就会触发类型不匹配报错。

修复步骤

1. 修改adapter的类型声明

把原来的星投影替换为明确的泛型类型,和你实际创建适配器时指定的泛型参数保持一致即可:

// 原来的错误声明
// private var adapter: FirestoreRecyclerAdapter<*, *> = ...
// 修改后的正确声明
private var adapter: FirestoreRecyclerAdapter<Restaurant, RestaurantListAdapter.ViewHolder> =
    object : FirestoreRecyclerAdapter<Restaurant, RestaurantListAdapter.ViewHolder>(options) {
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RestaurantListAdapter.ViewHolder {
            val view = LayoutInflater.from(parent.context)
                .inflate(R.layout.restaurant_card_view_design, parent, false)
            return RestaurantListAdapter.ViewHolder(view)
        }

        @SuppressLint("ResourceAsColor")
        override fun onBindViewHolder(
            holder: RestaurantListAdapter.ViewHolder , position: Int, model: Restaurant
        ) {
            // 原有onBindViewHolder逻辑保持不变
            val sharedPref = getPreferences(Context.MODE_PRIVATE) ?: return
            val defaultValue = resources.getString(R.string.def_loc_key)
            val lat = sharedPref.getFloat(getString(R.string.latitude_key), defaultValue.toFloat())
            val long = sharedPref.getFloat(getString(R.string.longitude_key), defaultValue.toFloat())

            model.calculateDistance(lat, long)

            // sets the text to the textview from our itemHolder class
            holder.distance.text = String.format("%.1f mi", model.distance)
            holder.name.text = model.name
            holder.reviewNum.text = String.format("(%1d)", model.numReview)
            holder.review.rating = model.review
            if (position == 0) {
                //holder.card.setCardBackgroundColor(R.color.recommendedCard)
                holder.card.setCardBackgroundColor(ContextCompat.getColor(holder.card.context, R.color.recommendedCard))
            }
            holder.logo.setImageResource(
                resources.getIdentifier(model.logo , "drawable",
                packageName
            ))
        }
    }

2. 修复排序逻辑隐藏问题

你当前的点击事件是在原有query基础上追加orderBy条件,不是替换排序规则,多次点击后会变成多字段复合排序,不符合切换排序的需求,建议修改为每次重新构建query:

val sortButton = findViewById<ImageButton>(R.id.sortButton)
sortButton.setOnClickListener {
    // 每次从根集合重新构建query,避免叠加排序条件
    query = FirebaseFirestore.getInstance()
        .collection("restaurant")
        .orderBy("numReviews", Query.Direction.DESCENDING)

    options = FirestoreRecyclerOptions.Builder<Restaurant>()
        .setQuery(query, Restaurant::class.java).build()

    adapter.updateOptions(options)
}

内容的提问来源于stack exchange,提问作者Hubert Rzeminski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 21:15:02