刷新recycvlerview后如何将数据加载到imageView

时间:2019-04-01 18:49:32

标签: android kotlin android-recyclerview recycler-adapter

我有两个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)
        }

0 个答案:

没有答案