Android firestore RecyclerView загружает неправильные изображения

#android #firebase #kotlin #android-recyclerview #google-cloud-firestore

#Android #firebase #kotlin #android-recyclerview #google-облако-firestore

Вопрос:

В моем приложении я использую firestore recyclerview, который в основном извлекает URL-адрес изображения из облачных документов firestore, и все выбранные URL-адреса загружаются с использованием библиотеки изображений glide в RecyclerView однако он успешно загружает изображения, но когда я начинаю прокручивать, изображение отображается в неправильном положении, и я просто не могу понять, в чем причина проблемы.

Вот мой код:

  private fun initializeData() {
        db = FirebaseFirestore.getInstance()
        val query: Query

            query = db!!.collection("Items")
            s = "Items"

        val response = FirestoreRecyclerOptions.Builder<FriendsResponse>()
                .setQuery(query, FriendsResponse::class.java)
                .build()
        adapter = object : FirestoreRecyclerAdapter<FriendsResponse, FriendsHolder>(response) {
            public override fun onBindViewHolder(holder: FriendsHolder, position: Int, model: FriendsResponse) {
                val id = snapshots.getSnapshot(position).id
                holder.exname.text = id
                db!!.collection("Items").document(id).get().addOnCompleteListener { task ->
                    if(activity!=null){
                    val document = task.result
                    val url = document!!.data!!["imageurl"] as String?
                      Glide.with(holder.imgmenu.context).load(url).into(holder.imgmenu)

                    }
                }
                holder.itemView.setOnLongClickListener {
                    s = "Items"
                    docname = (recyclerView!!.findViewHolderForAdapterPosition(position)!!.itemView.findViewById<View>(R.id.menuname) as TextView).text.toString()
                    false
                }
                holder.itemView.setOnClickListener { v ->
                    docname = (recyclerView!!.findViewHolderForAdapterPosition(position)!!.itemView.findViewById<View>(R.id.menuname) as TextView).text.toString()
                    db!!.collection("Items").document(docname!!).get().addOnCompleteListener { task ->
                        val document = task.result
                        val url = document!!.data!!["imageurl"] as String?
                        val id = document.data!!["Id"].toString()
                        val dialogBuilder = AlertDialog.Builder(activity)
                        val inflater = activity!!.layoutInflater
                        val dialogView = inflater.inflate(R.layout.fragment_itemdet, null)
                        dialogBuilder.setView(dialogView)

                        name = dialogView.findViewById(R.id.itemname)
                        img = dialogView.findViewById(R.id.itemdetimg)
                        img!!.setOnClickListener { v1 ->
                            docname = (recyclerView!!.findViewHolderForAdapterPosition(position)!!.itemView.findViewById<View>(R.id.menuname) as TextView).text.toString()
                            //Toast.makeText(getContext(),docname,Toast.LENGTH_LONG).show();
                            PickImageDialog.build(PickSetup()).show(activity!!)
                            val setup = PickSetup()
                            PickImageDialog.build(setup)
                                    .setOnClick(object : IPickClick {
                                        override fun onGalleryClick() {
                                            val intent = Intent()
                                            intent.type = "image/*"
                                            intent.action = Intent.ACTION_GET_CONTENT
                                            startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE)
                                        }

                                        override fun onCameraClick() {
                                            val cameraIntent = Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE)
                                            startActivityForResult(cameraIntent, REQUEST_CAMERA)

                                        }
                                    }).show(activity!!)

                        }
                        inst = dialogView.findViewById(R.id.tvinst)
                        etinst = dialogView.findViewById(R.id.etinst)
                        counter = dialogView.findViewById(R.id.counter)
                        add = dialogView.findViewById(R.id.add)
                        del = dialogView.findViewById(R.id.sub)
                        confirm = dialogView.findViewById(R.id.confirm)
                        val custom_font = Typeface.createFromAsset(activity!!.assets, "fonts/Poppins-ExtraBoldItalic.ttf")
                        name!!.typeface = custom_font
                        val alertDialog = dialogBuilder.create()
                        add!!.setOnClickListener { v -> counter!!.text = i  .toString() }
                        del!!.setOnClickListener { v -> counter!!.text = i--.toString() }
                        name!!.text = docname

                        Glide.with(holder.imgmenu.getContext()).load(url).into(img)
                        confirm!!.setOnClickListener { v ->
                            val qty = counter!!.text.toString()
                            val inst = etinst!!.text.toString()
                            if (qty == "0") {
                                Toasty.error(getContext()!!, "Please Specify Quantity", Toast.LENGTH_LONG, true).show()
                            } else {
                                db = FirebaseFirestore.getInstance()
                                db!!.collection("Order").document(TableListFragment.tableno)
                                        .update(
                                                "details", FieldValue.arrayUnion("$docname--$qty--$inst")
                                        ).addOnCompleteListener {
                                            Toasty.success(getContext()!!, "Item Added", Toast.LENGTH_LONG, true).show()
                                            alertDialog.dismiss()
                                        }.addOnFailureListener { e -> Log.i("WhatdFuck:", e.toString()) }

                            }
                        }
                        alertDialog.setTitle("Order")
                        alertDialog.setMessage("Enter Order Details")
                        alertDialog.show()
                    }

                }


            }

            override fun onCreateViewHolder(group: ViewGroup, i: Int): FriendsHolder {
                val view = LayoutInflater.from(group.context)
                        .inflate(R.layout.menu_item, group, false)

                return FriendsHolder(view)
            }

            override fun onError(e: FirebaseFirestoreException) {
                Log.e("error", e.message)
            }
        }

        adapter!!.notifyDataSetChanged()
        //int spaceInPixels = 200;
        val verticalDecoration = DividerItemDecoration(recyclerView!!.context,
                DividerItemDecoration.HORIZONTAL)
        val verticalDivider = ContextCompat.getDrawable(activity!!, R.drawable.divider_vertical)
        verticalDecoration.setDrawable(verticalDivider!!)
        recyclerView!!.addItemDecoration(verticalDecoration)

        val horizontalDecoration = DividerItemDecoration(recyclerView!!.context,
                DividerItemDecoration.VERTICAL)
        val horizontalDivider = ContextCompat.getDrawable(activity!!, R.drawable.divider_horizontal)
        horizontalDecoration.setDrawable(horizontalDivider!!)
        recyclerView!!.addItemDecoration(horizontalDecoration)
        recyclerView!!.adapter = adapter

    }  
  

Я также пробовал другие решения от Google, такие как выполнение запроса на отмену и передача null в imageview перед загрузкой с помощью glide, но они не работают.

Вот мои скриншоты: База данных:
введите описание изображения здесь

Просмотр в режиме рециркуляции:
введите описание изображения здесь

Комментарии:

1. Что происходит, когда вы передаете null в ImageView

2. Когда я передаю null, сначала ничего не происходит, imageview загружается без изображений, после этого загружается правильное изображение с URL, но как только я начинаю прокручивать, изображения меняются и отображаются в неправильном положении

3. Попробуйте, Glide.clear(holder.imgmenu) и я не уверен, в Glide.with(holder.imgmenu.context) ли проблема, но попробуйте передать контекст действия.

4. Вы пытались заменить «position» на myDataset.get (holder.adapterPosition)?

5. @NicolaGallazzi да, я тоже это делал, но это не работает, и моя проблема все та же

Ответ №1:

Переопределите эти два метода в адаптере.

 @Override
public long getItemId(int position) {
    return position;
}

@Override
public int getItemViewType(int position) {
   return position;
}
  

Извините, я не знаком с Kotlin.

Комментарии:

1. Я использую firestore recycler view, а не обычный recyler view

2. Эти два метода также доступны в адаптере firebase recycler. Я не уверен, пожалуйста, проверьте это.