【问题标题】:A list of 10+ items are retrieved from firebase database, after 9th item 10th item is affecting 1st and 11th item is affecting 2nd item and so on从 Firebase 数据库中检索到 10 多个项目的列表,在第 9 个项目之后,第 10 个项目影响第 1 个项目,第 11 个项目影响第 2 个项目,依此类推
【发布时间】:2021-05-11 18:51:15
【问题描述】:

我正在从 firebase 数据库中检索项目列表,并在我的 android 应用程序中使用 RecyclerView 显示它们。问题是当我检索超过 9 个项目并更新第一个项目中的一些数据(运行时)时,如您在下图中所见,第 10 个项目也受到影响,反之亦然,第 2 个和第 11 个项目等在。 就像我添加和固定第 1 项的数量一样,第 10 项也是如此(第 10 项也添加了与第 1 项相同的数量)。

MenuFragment.kt

class MenuFragment : Fragment() {

private var dishList: MutableList<DishModel> = mutableListOf()
private lateinit var myRef: DatabaseReference
lateinit var list: RecyclerView
lateinit var proceedToCartLayout: RelativeLayout
lateinit var addToCartBtn: Button
private var selectedCategory = ""

companion object {
    fun newInstance(): Fragment {
        return MenuFragment()
    }
}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    val view = inflater.inflate(R.layout.fragment_menu, container, false)
    //retrieve id
    val bundle = this.arguments
    selectedCategory = bundle!!.getString("CATEGORY_ID")!!
    list = view.findViewById(R.id.recyclerMenu)
    myRef = FirebaseDatabase.getInstance().getReference("Category")
    proceedToCartLayout = view.findViewById(R.id.ProceedToCart)
    addToCartBtn = view.findViewById(R.id.btn_cart)
    return view
}


override fun onResume() {

    if (ConnectionManager().checkConnectivity(activity as Context)) {
        fetchMenu()

    } else {

        val alterDialog = androidx.appcompat.app.AlertDialog.Builder(activity as 
Context)
        alterDialog.setTitle("No Internet")
        alterDialog.setMessage("Connect to internet to continue")
        alterDialog.setIcon(R.drawable.nointernet)
        alterDialog.setPositiveButton("Open Settings") { _, _ ->
            val settingsIntent = Intent(Settings.ACTION_SETTINGS)//open wifi settings
            startActivity(settingsIntent)
        }

        alterDialog.setNegativeButton("Exit") { _, _ ->
            ActivityCompat.finishAffinity(activity as Activity)
        }
        alterDialog.setCancelable(false)

        alterDialog.create()
        alterDialog.show()

    }

    super.onResume()
}

private fun fetchMenu() {
    myRef.child(selectedCategory).addValueEventListener(object : ValueEventListener {
        override fun onCancelled(p0: DatabaseError) {
            Toast.makeText(context, "$p0", Toast.LENGTH_SHORT).show()
        }

        override fun onDataChange(p0: DataSnapshot) {
            if (p0.exists()) {
                dishList.clear()
                for (i in p0.children) {
                    val plan = i.getValue(DishModel::class.java)
                    dishList.add(plan!!)
                }

                val adapter = MenuAdapter(
                    context!!,
                    R.layout.menu_list_item,
                    dishList,
                    proceedToCartLayout,
                    addToCartBtn, selectedCategory
                )
                list.adapter = adapter

            }
        }

    })

}

}

MenuAdapter.kt

class MenuAdapter(
private val ctx: Context,
private val layoutResId: Int,
private val dishList:
List<DishModel>,
private val proceedToCartPassed: RelativeLayout,
private val buttonProceedToCart: Button,
private val categoryName: String
)  : RecyclerView.Adapter<MenuAdapter.MyViewHolder>() {

private lateinit var proceedToCart: RelativeLayout
private var itemSelectedCount: Int = 0
private var itemsSelectedId = arrayListOf<String>()
private var itemList = arrayListOf<DishModel>()

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MenuAdapter.MyViewHolder {
    val layoutInflater: LayoutInflater = LayoutInflater.from(ctx)
    val view: View = layoutInflater.inflate(layoutResId, null)
    return MyViewHolder(view)
}

override fun onBindViewHolder(holder: MenuAdapter.MyViewHolder, position: Int) {
    var btnClick = false
    var no = 0
    val range = 1..5

    val dish = dishList[position]
    holder.dishName.text = dish.dishName
    holder.dishPrice.text = "Rs " + dish.cost + " /-"
    Picasso.get().load(dish.image).error(R.drawable.defaultdish).into(holder.dishImage)


    holder.increaseBtn.setOnClickListener {
        if (btnClick) {
            no += 1
            if (no in range) {
                holder.quantity.text = no.toString()
                dish.qty = no
            }
        }
    }

    holder.decreaseBtn.setOnClickListener {
        if (btnClick) {
            no -= 1
            if (no in range) {
                holder.quantity.text = no.toString()
                dish.qty = no
            }
        }
    }


    proceedToCart = proceedToCartPassed

    buttonProceedToCart.setOnClickListener {
        val intent = Intent(ctx, CartActivity::class.java)
        intent.putExtra(
            "categoryId",
            categoryName
        )
        intent.putExtra(
            "selectedItemsId",
            itemsSelectedId
        )
        intent.putExtra("itemList", itemList)
        ctx.startActivity(intent)
    }

    holder.buttonAddToCart.setOnClickListener {

        if (holder.buttonAddToCart.text.toString() == "Remove") {

            itemSelectedCount--//unselected

            itemsSelectedId.remove(holder.buttonAddToCart.tag.toString())
            itemList.remove(dish)

            holder.buttonAddToCart.text = "Add"
            holder.buttonAddToCart.setBackgroundResource(R.drawable.rounded_corners)
            btnClick = false
            no = 0
            dish.qty = no
            holder.quantity.text = no.toString()


        } else {
            itemSelectedCount++//selected
            itemsSelectedId.add(holder.buttonAddToCart.tag.toString())
            itemList.add(dish)

            holder.buttonAddToCart.text = "Remove"
            holder.buttonAddToCart.setBackgroundResource(R.drawable.rounded_corners_yellow)
            btnClick = true
            no = 1
            dish.qty = no
            holder.quantity.text = no.toString()
        }

        if (itemSelectedCount > 0) {
            proceedToCart.visibility = View.VISIBLE
        } else {
            proceedToCart.visibility = View.GONE
        }

    }

    holder.buttonAddToCart.tag = dishList.indexOf(dish) + 1
}

override fun getItemCount(): Int {
    return dishList.size
}


inner class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) {

    val dishName: TextView = view.findViewById(R.id.txtDishName)
    val dishPrice: TextView = view.findViewById(R.id.txtDishPrice)
    val dishImage: ImageView = view.findViewById(R.id.dishImage)
    val buttonAddToCart: Button = view.findViewById(R.id.add_dish)
    val increaseBtn: Button = view.findViewById(R.id.increase)
    val decreaseBtn: Button = view.findViewById(R.id.decrease)
    val quantity: TextView = view.findViewById(R.id.quantity)

}

}

【问题讨论】:

标签: android firebase android-recyclerview


【解决方案1】:

请添加 holder.quantity.text = dish.qty.toString() 之后或之前随意 Picasso.get().load(dish.image).error(R.drawable.defaultdish).into(holder.dishImage)

如下所示。

    Picasso.get().load(dish.image).error(R.drawable.defaultdish).into(holder.dishImage)
    holder.quantity.text = dish.qty.toString()

    holder.increaseBtn.setOnClickListener

因为我可以看到您没有设置 holder.quantity.text,认为您的 recyclerview 项目视图默认为 0,但正如您在 recyclerview 中所知道的那样,视图已被重用以及何时重用。被重用的默认值不是0,而是要重用的最后一个视图的值,在你的情况下是每10个项目。

如果您正在使用 recylerview 并考虑使用 XML 视图本身的任何视图的默认值,则黄金法则,所以当您开始滚动时您会感到惊讶,您会注意到情况并非如此,默认值是除此之外的东西。

  • 始终在 onBind 中设置默认值,以便下次重用视图时,它会采用您想要的默认值
  • 如果您有 if 条件来更新某些内容,请务必写入 else,因为相同的缓存会让您想知道为什么您的项目表现不同。
  • 重要一点,请确保您在第 1 点设置的默认值在您设置的任何 clicklistener 或任何 view listener 之外,因为我们必须确保每次调用 onBind 时都会执行 setter

我在使用项目中的复选框、编辑文本、单选按钮等方面拥有相当多的经验,并且在滚动时给我带来了令人惊讶的结果,因此我在使用 recylerviews 时始终确保遵循上述几点。

【讨论】:

    【解决方案2】:

    我在我的适配器中添加了以下代码(覆盖 getItemViewType)并且它有效!

    override fun getItemViewType(position: Int): Int {
        return position
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多