使用 updateOptions() 更新 FirestoreRecyclerAdapter 会出现类型不匹配错误
Posted
技术标签:
【中文标题】使用 updateOptions() 更新 FirestoreRecyclerAdapter 会出现类型不匹配错误【英文标题】:Updating FirestoreRecyclerAdapter using updateOptions() give Type mismatch error 【发布时间】:2021-12-30 23:32:33 【问题描述】:我正在使用 Firebase UI 填充我的 RecyclerView,一切正常,除非我在单击按钮时尝试更改列表元素的顺序。
这是我的适配器代码:
private var query: Query = FirebaseFirestore.getInstance()
.collection("restaurant")
.orderBy("review", Query.Direction.DESCENDING)
var options: FirestoreRecyclerOptions<Restaurant> = FirestoreRecyclerOptions.Builder<Restaurant>()
.setQuery(query, Restaurant::class.java)
.build()
private var adapter: FirestoreRecyclerAdapter<*, *> =
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
)
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
))
这是我的按钮点击代码(在 onCreate() 内):
val sortButton = findViewById<ImageButton>(R.id.sortButton)
sortButton.setOnClickListener
query = query.orderBy("numReviews", Query.Direction.DESCENDING) // new campo
options = FirestoreRecyclerOptions.Builder<Restaurant>()
.setQuery(query, Restaurant::class.java).build()
adapter.updateOptions(options)
我在最后一行出现错误:
类型不匹配:推断的类型是 FirestoreRecyclerOptions 但没有预期
【问题讨论】:
【参考方案1】:当您使用以下查询时:
private var query: Query = FirebaseFirestore.getInstance()
.collection("restaurant")
.orderBy("review", Query.Direction.DESCENDING)
这只是意味着试图获取“restaurant”集合中存在的所有文档,按“review”降序排序。这很好。但是,当您使用以下行时:
query = query.orderBy("numReviews", Query.Direction.DESCENDING)
这意味着您正在向现有查询添加额外的订单。所以在添加了上面的 orderBy 之后,你的查询是这样的:
private var query: Query = FirebaseFirestore.getInstance()
.collection("restaurant")
.orderBy("review", Query.Direction.DESCENDING)
.orderBy("numReviews", Query.Direction.DESCENDING)
这种类型的查询默认不起作用,因为它需要index。
请注意,Cloud Firestore 查询是不可变的,这意味着您无法更改现有查询的属性。如果您通过调用“orderBy()”方法更改值,它将成为一个新查询。因此,如果您只想更改顺序,只需将第二个查询更改为:
query = FirebaseFirestore.getInstance()
.collection("restaurant")
.orderBy("numReviews", Query.Direction.DESCENDING)
// ?
【讨论】:
我已经这样做了,并在之前添加了 stopListening() 和 startListeningAfter() 但 UI 没有更新,它只是像它应该做的那样闪烁,但元素的顺序没有改变。跨度> 没有看到修改后的代码,我帮不上什么忙。所以请使用自己的MCVE 在 *** 上发布一个新问题,以便我和其他 Firebase 开发人员可以帮助您。以上是关于使用 updateOptions() 更新 FirestoreRecyclerAdapter 会出现类型不匹配错误的主要内容,如果未能解决你的问题,请参考以下文章