Android 如何在getter setter方法中定义Imageview

Android 如何在getter setter方法中定义Imageview,android,kotlin,android-recyclerview,android-handler,Android,Kotlin,Android Recyclerview,Android Handler,你好,伙计,我是Kotlin android的新手,在这个演示中正在制作一个演示,我正在尝试从图库中获取一个图像,并将其设置在我的recyclerview中,但我得到的解决方案要求您提前为我找到一个解决方案,谢谢 这是我的CustomAdapter.kt:- package com.example.itemgetset import android.app.Activity import android.app.AlertDialog import android.content.Conten

你好,伙计,我是Kotlin android的新手,在这个演示中正在制作一个演示,我正在尝试从图库中获取一个图像,并将其设置在我的recyclerview中,但我得到的解决方案要求您提前为我找到一个解决方案,谢谢

这是我的CustomAdapter.kt:-

package com.example.itemgetset

import android.app.Activity
import android.app.AlertDialog
import android.content.ContentValues.TAG
import android.content.Intent
import android.os.Build
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.PopupMenu
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.snackbar.Snackbar

@Suppress("UNREACHABLE_CODE")
class CustomAdapter(
    private var activity: Activity,
    private val userList: ArrayList<ProductInfoGetSet>,
    private var isforlist: Boolean,
) :
    RecyclerView.Adapter<CustomAdapter.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val itemview=
            LayoutInflater.from(parent.context).inflate(R.layout.list_layout, parent, false)
        return ViewHolder(itemview)
    }

    @RequiresApi(Build.VERSION_CODES.N)
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {

        val productInfoGetSet: ProductInfoGetSet = userList[position]

        holder.image = productInfoGetSet.image
        holder.txtId.text = productInfoGetSet.id
        holder.txtName.text = productInfoGetSet.name
        holder.txtQuantity.text = productInfoGetSet.quantity
        holder.txtPrice.text = productInfoGetSet.price

        val id = userList[position].id
        Log.e(TAG, "List item ID: $id")

        holder.buttonViewOption.setOnClickListener {

            val popup = PopupMenu(activity, holder.buttonViewOption)
            popup.inflate(R.menu.pop_menu)
            popup.setOnMenuItemClickListener { item ->
                when (item.itemId) {
                    R.id.edit -> {
                        val intent = Intent(activity, AddDetails::class.java)
                        intent.putExtra("isFor", "Update")
                        intent.putExtra("id", productInfoGetSet.id)
                        intent.putExtra("image",productInfoGetSet.image)
                        intent.putExtra("name", productInfoGetSet.name)
                        intent.putExtra("quantity", productInfoGetSet.quantity)
                        intent.putExtra("price", productInfoGetSet.price)
                        activity.startActivity(intent)
                    }
                    R.id.delete -> {
                        val builder = AlertDialog.Builder(activity)
                        builder.setTitle("Delete")
                        builder.setMessage("Do you want to delete the item?")

                        builder.setPositiveButton("Yes") { _, _ ->
                            userList.removeAt(position)
                            notifyItemRemoved(position)
                            val snack = Snackbar
                                .make(
                                    holder.linearly,
                                    "Item was removed from the list.",
                                    Snackbar.LENGTH_SHORT
                                )
                            snack.show()
                        }
                        builder.setNegativeButton("No") { _, _ ->
                        }
                        val dialog: AlertDialog = builder.create()
                        dialog.show()
                    }
                }
                false
            }
            popup.show()
        }
    }

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

    override fun getItemCount(): Int {
        return userList.size
    }

    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val txtName = itemView.findViewById(R.id.txt_name) as TextView
        val txtId = itemView.findViewById(R.id.txt_id) as TextView
        var image = itemView.findViewById(R.id.imageView2) as ImageView
        val txtQuantity = itemView.findViewById(R.id.txt_quantity) as TextView
        val txtPrice = itemView.findViewById(R.id.txt_price) as TextView
        val linearly: LinearLayout = itemView.findViewById(R.id.linearlayout)
        val buttonViewOption = itemView.findViewById<View>(R.id.txt_Options) as TextView
    }
}
温度kt:-

package com.example.itemgetset

import android.widget.ImageView

class Temp {
    var id: String = ""
    var image: ImageView =
    var name: String = ""
    var quantity: String = ""
    var price: String = ""
}

提前谢谢

最好显示ProductInfoGetSet类和错误日志

您不应该直接设置图像

holder.image = productInfoGetSet.image
相反,您可以获取图像的URI,然后将其设置为

holder.image.setImageUri(imageUri)

如果您仍然遇到问题,那么您可以使用

我知道您是Android新手。我将在下面列出一些要点,以便您清楚地理解

  • 作为标准做法,您不得在任何模型中使用ImageView,因为模型只能保存数据
  • 对视图使用数据绑定
  • 正如Rupam Saini所建议的,您可以使用Glide或毕加索来加载图像
  • 您不能在包中传递imageView,因为当您再次读取它时,它将创建不同的对象。也有可能泄露上下文
  • 关于你的问题

    在此适配器中,holder.image=productInfoGetSet.image上的代理和错误将导致此行失败,无法解决


    您试图将一个ImageView设置为另一个不正确的ImageView。临时文件不正确,在=。所以临时文件也必须有错误。

    “holder.image”是ImageView,“productInfoGetSet.image”是图像URL(我认为是字符串),所以可能是问题的原因,您可以通过调用一些ImageView方法来设置像holder.image.setImageURI(此处为imageUrl)这样的图像来设置临时文件吗。我在我的Temp.kt文件中尝试了它,我也会更改它,但我不知道如何定义imageview我将textview定义为“var name:String=”“”你能帮我一下吗?我尝试了这个,但现在我必须在Temp.kt文件中定义image,我遇到了一个错误,我不知道如何定义imageview,请帮我一下。提前谢谢。我还编辑并放置了该文件,请查看。问题似乎出在
    temp.image=imageview.toString()
    中,我也对其进行了更改。但现在的问题是在Temp.kt文件中定义ImageView。这样做无法获取路径或URI。相反,您应该更改ProductInfoGetSet和Temp中映像的数据类型。另外,在AddDetails.kt中将imageView的数据类型更改为URI,并使用onActivityResult中的URI对其进行初始化。最后,将CustomAdapter中的行
    holder.image=productInfoGetSet.image
    更改为
    holder.image.setImageUri(productInfoGetSet.image)
    。我现在唯一的问题是如何在getter setter中设置图像。任何人都可以在这方面提供帮助。是的,现在只有一个错误,我必须在ImageView=中定义一些东西,但问题是我不知道如何定义它。请在这方面帮助我。在模型中使用ImageView的方法不正确,正如我在第1点和第4点中提到的。您应该切换到数据绑定或在模型中设置url,并在运行时将其加载到ImageView.temp.image=ImageView.toString()这也是错误的我现在唯一的问题是如何在getter setter中设置图像。任何人都可以在这方面提供帮助。@Jay3421-您不能使用getter setter设置图像。您可以拥有url并在Imageview上使用setImageUri方法进行设置,也可以拥有可绘制资源Id并在Imageview上使用setImageResource进行设置。
    package com.example.itemgetset
    
    import android.widget.ImageView
    
    class Temp {
        var id: String = ""
        var image: ImageView =
        var name: String = ""
        var quantity: String = ""
        var price: String = ""
    }
    
    holder.image = productInfoGetSet.image
    
    holder.image.setImageUri(imageUri)