【问题标题】:Updating FirestoreRecyclerAdapter using updateOptions() give Type mismatch error使用 updateOptions() 更新 FirestoreRecyclerAdapter 会出现类型不匹配错误
【发布时间】: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 但没有预期

【问题讨论】:

    标签: android firebase kotlin google-cloud-platform google-cloud-firestore


    【解决方案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 在 StackOverflow 上发布一个新问题,以便我和其他 Firebase 开发人员可以帮助您。
    猜你喜欢
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    相关资源
    最近更新 更多