调用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
相关产品推荐
相关产品推荐

