使用 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 会出现类型不匹配错误的主要内容,如果未能解决你的问题,请参考以下文章

Swift 2.3 pod 更新后使用未解析的标识符 Firebase 'FIR'

vue中 input事件来更新v-model数据

2.5.2 - 性能 - 软件需求和 Fir.im

quartus FIR IP核使用 FIR II

使用MATLAB设计FIR滤波器

FIR仿真教程__Altera FIR