Android Firestore RecyclerView загружает неправильные изображения - PullRequest
1 голос
/ 28 марта 2019

В моем приложении я использую просмотр в Firestore Recycleler, который в основном извлекает 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, такие как выполнение запроса на отмену и передача нулядля просмотра изображений перед загрузкой с использованием Glide, но они не работают.

Вот мои скриншоты: База данных: enter image description here

Recycler View: enter image description here

1 Ответ

0 голосов
/ 28 марта 2019

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...