【问题标题】:Android Kotlin: Wrong images showing in RecyclerView. How can I fix it?Android Kotlin:RecyclerView 中显示错误的图像。我该如何解决?
【发布时间】:2021-01-26 23:23:15
【问题描述】:

我在 recyclerview 列表中显示的图片相互混合。假设字母A表示照片X,字母B表示照片Y。在我的Recyclerview列表中,A显示Y照片,B显示照片X。当我再次打开应用程序时,没有问题。我已经处理这个问题几天了,我尝试了很多解决方案,但直到现在我才找到真正的解决方案。我该如何解决?谢谢

如果您想查看我的适配器和活动代码,我分享了以下内容

我的适配器:

class NoteAdapter(private var titleText: ArrayList<String>, private var imageButton: ArrayList<String>, private var noteText: ArrayList<String>) : RecyclerView.Adapter<NoteAdapter.ViewHolder>() {


    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        val itemTitle : TextView = itemView.findViewById(R.id.recyclerTitleText)
        val itemImage : ImageView = itemView.findViewById(R.id.recyclerImage)




        init {

            itemView.setOnClickListener { v: View ->

               // Toast.makeText(itemView.context,"You clicked on item # ${position + 1}", Toast.LENGTH_SHORT).show()
                val intent = Intent(itemView.context, PastNotesActivity::class.java)
                intent.putExtra("oldTitle", titleText[position])
                intent.putExtra("oldNote", noteText[position])
                intent.putExtra("oldImage", imageButton[position])
                itemView.context.startActivity(intent)

            }


        }
    }


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {

        val v = LayoutInflater.from(parent.context).inflate(R.layout.recycler_row, parent, false)
        return ViewHolder(v)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {

        holder.itemTitle.text = titleText[position]
        Picasso.get().load(imageButton[position]).resize(150,150).into(holder.itemImage)

    }

    override fun getItemCount(): Int {

        return titleText.size
    }


}

我的活动

class ListViewActivity : AppCompatActivity() {

    private  lateinit var auth: FirebaseAuth
    private lateinit var db : FirebaseFirestore

    var titleTextFromFB : ArrayList<String> = ArrayList()
    var noteTextFromFB : ArrayList<String> = ArrayList()
    var imageFromFB : ArrayList<String> = ArrayList()


    var adapter: NoteAdapter? = null



    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_list_view)

        auth = FirebaseAuth.getInstance()
        db = FirebaseFirestore.getInstance()

        getDataFromFirestore()

        // recyclerview

        var layoutManager = LinearLayoutManager(this)
        recyclerView.layoutManager = layoutManager

        adapter = NoteAdapter(titleTextFromFB, imageFromFB, noteTextFromFB)
        recyclerView.adapter = adapter

    }


    override fun onCreateOptionsMenu(menu: Menu?): Boolean {

        val menuInflater = menuInflater
        menuInflater.inflate(R.menu.add_note, menu)

        return super.onCreateOptionsMenu(menu)
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {

        if (item.itemId == R.id.add_note_click) {
            // Take Notes Activity
            val intent = Intent(applicationContext, TakeNotesActivity::class.java)
            intent.putExtra("info","new")
            startActivity(intent)

        } else if (item.itemId == R.id.log_out) {

            val alert = AlertDialog.Builder(this)

            alert.setTitle("Log Out")
            alert.setMessage("Are you sure to logout from the app ?")
            alert.setPositiveButton("Yes") {dialog, which ->

                auth.signOut()
                val intent = Intent(applicationContext, MainActivity::class.java)
                startActivity(intent)
                finish()
            }

            alert.setNegativeButton("No") {dialog, which ->

            }

            alert.show()

        }

        return super.onOptionsItemSelected(item)
    }

    // get data from firestore

    fun getDataFromFirestore() {

        db.collection("Notes").orderBy("date", Query.Direction.DESCENDING).addSnapshotListener{ snapshot, exception ->

            if (exception != null) {

                // If there is a error ,

                Toast.makeText(applicationContext, exception.localizedMessage.toString(), Toast.LENGTH_LONG).show()

            } else {

                if (snapshot != null) {

                    if (!snapshot.isEmpty) {

                        titleTextFromFB.clear()
                        noteTextFromFB.clear()

                        val documents = snapshot.documents
                        for (document in documents) {

                            val userEmail = document.get("userEmail") as String
                            val noteTitle = document.get("noteTitle") as String
                            val yourNote = document.get("yourNote") as String
                            val downloadUrl = document.get("downloadUrl") as String
                            val timestamp = document.get("date") as Timestamp
                            val date = timestamp.toDate()

                            titleTextFromFB.add(noteTitle)
                            imageFromFB.add(downloadUrl)
                            noteTextFromFB.add(yourNote)

                            adapter!!.notifyDataSetChanged()

                        }
                    }
                }

            }


        }


    }


}

【问题讨论】:

  • 嘿,将图像图像视图持有者的 val 转换为 var,即 viewHolder 中的 val itemImage :ImageViewvar itemImage : ImageView
  • 嗨,我确实喜欢这个 bu 没用:var itemImage : ImageView = itemView.findViewById(R.id.recyclerImage)

标签: android firebase android-studio kotlin android-recyclerview


【解决方案1】:

尝试在 Recyclerview 适配器中添加以下覆盖函数。

    override fun getItemId(position: Int):Long  {
        return position.toLong()
    }

   override fun getItemViewType(position: Int):Int {
        return position
    }

【讨论】:

  • (我将代码编辑为 Kotlin 版本)。我试过了,但没有用
猜你喜欢
  • 1970-01-01
  • 2022-12-15
  • 2021-10-04
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 2015-06-10
  • 2021-01-08
  • 2021-09-18
相关资源
最近更新 更多