#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. Я не уверен, пожалуйста, проверьте это.