我有两个recyclerViews,它们代表我的购物清单。 当我单击一个项目时,它会“转移”到另一个列表。 问题在于图像已加载到Glide和Firebase Storage中,即使listitem没有路径也无法显示正确的图像。
我已经尝试了每个notifyDataSetChanged(),recyclerView.notifyItemChanged()和recyclerView.invalidate()等。也许你可以帮我。
这是我的适配器:
class RecyclerViewAdapterEinkaufslisteDetail(
val context: Context,
val lebensmittelList: ArrayList<Inventarstueck>
) :
RecyclerView.Adapter<RecyclerViewAdapterEinkaufslisteDetail.ViewHolder>() {
override fun onBindViewHolder(holder: RecyclerViewAdapterEinkaufslisteDetail.ViewHolder, position: Int) {
// TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
//Es wird der Name, die Anzahl, die Einheit (gramm, kg, etc) das Bild und ein Warnzeichen angezeigt, falls ein Produkt abläufty
holder.mName.text = lebensmittelList[position].name_de.toString()
val array = holder.itemView.getContext().getResources().getStringArray(R.array.einheit_kurz)
val placeholder =
lebensmittelList[position].restlichemenge.toString() + " " + array[lebensmittelList[position].einheit!!]
holder.mAnzahl.text = placeholder
// holder.txtTitle.text = userList[position]
holder.mZeichen.visibility = View.INVISIBLE
//KLEINEs Anzeigebild der Produkte runterladen
if (!(lebensmittelList[position].fotoURL.isNullOrEmpty() || lebensmittelList[position].fotoURL.isNullOrBlank())) {
//Überprüfen, ob im Feld die Endung gespeichert ist, wenn nicht, immer png!!
val url:String
if(lebensmittelList[position].fotoURL!!.endsWith(".png")){
url = lebensmittelList[position].fotoURL!!
}else{
url = lebensmittelList[position].fotoURL + ".png"
}
val storage = FirebaseStorage.getInstance()
val storageRef = storage.reference
// Points to "images"
val imagesRef = storageRef.child(Constants.FIREBASE_STORAGE_PRODUKTFOTO_KLEIN_PFAD)
val fotoRef = imagesRef.child(url)
GlideApp.with(this.context).load(fotoRef).into(holder.mProduktfoto)
}
}
override fun getItemCount(): Int {
return lebensmittelList.size
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerViewAdapterEinkaufslisteDetail.ViewHolder {
val v = LayoutInflater.from(parent.context).inflate(R.layout.recyclerview_item_inventar, parent, false)
return ViewHolder(v)
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener, View.OnLongClickListener{
init {
itemView.setOnClickListener(this)
itemView.setOnLongClickListener(this)
}
override fun onClick(v: View) {
clickListener!!.onItemClick(adapterPosition, v);
}
override fun onLongClick(v: View): Boolean {
clickListener!!.onItemLongClick(adapterPosition, v)
return true
}
val mName = itemView.findViewById<TextView>(R.id.rvInventar_tv_Produktname)
val mAnzahl = itemView.findViewById<TextView>(R.id.rvInventar_tv_Anzahl)
val mProduktfoto = itemView.findViewById<ImageView>(R.id.rvInventarProduktFoto)
val mZeichen = itemView.findViewById<ImageView>(R.id.rvInventar_Icon)
// val txtTitle = itemView.findViewById<TextView>(R.id.txtTitle)
val mCard = itemView.findViewById<MaterialCardView>(R.id.rvCardInventar)
}
fun setOnItemClickListener(clickListener: ClickListener) {
RecyclerViewAdapterEinkaufslisteDetail.clickListener = clickListener
}
interface ClickListener {
fun onItemClick(position: Int, v: View)
fun onItemLongClick(position: Int, v: View)
}
companion object {
private var clickListener: RecyclerViewAdapterEinkaufslisteDetail.ClickListener? = null
}
}
这是我更改数据的地方
rvKaufen = findViewById(R.id.rvEinkaufslisteDetailKaufen)
val layoutmanager = GridLayoutManager(this, 3)
rvKaufen.layoutManager = layoutmanager
rvGekauft = findViewById(R.id.rvEinkaufslisteDetailGekauft)
val layoutmanager2 = GridLayoutManager(this, 3)
rvGekauft.layoutManager = layoutmanager2
rvadapter = RecyclerViewAdapterEinkaufslisteDetail(this, itemsInEinkaufsliste)
// val rvadapter = RecyclerViewAdapterInventar(this.context!!, lebensmittelliste)
rvadapterGekauft = RecyclerViewAdapterEinkaufslisteDetail(this, itemsGekauft)
//nur einmal itemclicklistener zuweisen, sonst megafehler! intern abrufen aus welchem Recyclerview der Click gekommen ist
/**/ rvadapter.setOnItemClickListener(object : RecyclerViewAdapterEinkaufslisteDetail.ClickListener {
override fun onItemClick(position: Int, v: View) {
Log.d("Click", "onItemClick position: $position")
val parentId = (v.parent as View).id
if (parentId == rvKaufen.id) {
Toast.makeText(this@EinkaufslisteDetail, "GeKAUFt", Toast.LENGTH_SHORT).show()
/* val inventarstueck = rvadapter.lebensmittelList[position].copy()
//Hier auch aus den Listen löschen??
//TODO
rvadapterGekauft.lebensmittelList.add(inventarstueck)
rvadapterGekauft.notifyDataSetChanged()
rvadapter.lebensmittelList.removeAt(position)
// itemsInEinkaufsliste.removeAt(position)
rvadapter.notifyItemRemoved(position)
// rvadapter.lebensmittelList.removeAt(position)
*/
//rvadapter.notifyDataSetChanged()
val inventarstueck = itemsInEinkaufsliste[position].copy()
//itemsGekauft.add(inventarstueck)
itemsGekauft.add(inventarstueck)
rvadapterGekauft.notifyItemInserted(itemsGekauft.size-1)
// rvadapterGekauft.notifyItemRangeChanged(0,itemsGekauft.size)
itemsInEinkaufsliste.removeAt(position)
rvadapter.notifyItemRemoved(position)
rvadapter.notifyItemRangeChanged(position,itemsInEinkaufsliste.size)
/* rvKaufen.adapter = null
rvKaufen.layoutManager = null
rvKaufen.adapter = rvadapter
val layoutmanager3 = GridLayoutManager(this@EinkaufslisteDetail, 3)
rvKaufen.layoutManager = layoutmanager3
rvadapter.notifyDataSetChanged()
//rvKaufen.removeViewAt(position)
// rvGekauft.add
rvGekauft.adapter = null
rvGekauft.layoutManager = null
rvGekauft.adapter = rvadapterGekauft
val layoutmanager4 = GridLayoutManager(this@EinkaufslisteDetail, 3)
rvKaufen.layoutManager = layoutmanager4
rvadapterGekauft.notifyDataSetChanged()*/
} else if (parentId == rvGekauft.id) {
Toast.makeText(this@EinkaufslisteDetail, "Zurück geschoben", Toast.LENGTH_SHORT).show()
/* val inventarstueck = rvadapterGekauft.lebensmittelList[position].copy()
rvadapter.lebensmittelList.add(inventarstueck)
rvadapter.notifyDataSetChanged()
rvadapterGekauft.lebensmittelList.removeAt(position)
rvadapterGekauft.notifyItemRemoved(position)*/
val inventarstueck = itemsGekauft[position].copy()
//itemsGekauft.add(inventarstueck)
itemsInEinkaufsliste.add(inventarstueck)
rvadapter.notifyItemInserted(itemsInEinkaufsliste.size-1)
// rvadapter.notifyItemRangeChanged(0,itemsInEinkaufsliste.size)
itemsGekauft.removeAt(position)
rvadapterGekauft.notifyItemRemoved(position)
rvadapterGekauft.notifyItemRangeChanged(position,itemsGekauft.size)
/* rvKaufen.adapter = null
rvKaufen.layoutManager = null
rvKaufen.adapter = rvadapter
val layoutmanager3 = GridLayoutManager(this@EinkaufslisteDetail, 3)
rvKaufen.layoutManager = layoutmanager3
rvadapter.notifyDataSetChanged()
rvGekauft.adapter = null
rvGekauft.layoutManager = null
rvGekauft.adapter = rvadapterGekauft
val layoutmanager4 = GridLayoutManager(this@EinkaufslisteDetail, 3)
rvKaufen.layoutManager = layoutmanager4
rvadapterGekauft.notifyDataSetChanged()*/
}
}
override fun onItemLongClick(position: Int, v: View) {
Log.d("Click", "onItemLongClick pos = $position")
Log.d("Click", "onItemClick position: $position")
val parentId = (v.parent as View).id
if (parentId == rvKaufen.id) {
Toast.makeText(this@EinkaufslisteDetail, "Verändern", Toast.LENGTH_SHORT).show()
val inventarstueck = rvadapter.lebensmittelList[position].copy()
val intent = Intent(this@EinkaufslisteDetail, EinkaufslisteProduktBearbeiten::class.java)
intent.putExtra("swissID",inventarstueck.swiss_id)
intent.putExtra("scandatum",inventarstueck.scandatum)
intent.putExtra("einkaufslistenID",einkaufslistenID)
startActivityForResult(intent,_resultCODE)
}else if (parentId == rvGekauft.id) {
Toast.makeText(this@EinkaufslisteDetail, "Keine Aktion möglich", Toast.LENGTH_SHORT).show()
}
}
})
当我也在第二个recyclerView上调用SetItemClickListener时,整个过程将无法正常工作。
很少使用两个recyclerViews,所以我也什么也没发现。
编辑 我找到了解决问题的方法:
如果没有URL,我将ImageView设置为默认图片。
if (!(lebensmittelList[position].fotoURL.isNullOrEmpty() || lebensmittelList[position].fotoURL.isNullOrBlank())) {
.
.
. GlideApp.with(this.context).load(fotoRef).into(holder.mProduktfoto)
}else{
holder.mProduktfoto.setImageResource(R.drawable.logo_384_384)
}