簡體   English   中英

如何將數據從 RecyclerView 應用到 MainActivity

[英]How to apply data from RecyclerView to MainActivity

我有帶有圖像的水平 Recyclerview。 當我單擊 Recyclerview 上的圖像來設置我的 MainActivity imageView 的背景時,我想要。 我不知道如何從 Recyclerview 申請到我的 Mainactivity class。

這是我的 MainActivity class:

 class MainActivity : AppCompatActivity() {
    
        private lateinit var recyclerView: RecyclerView
        private var imagesUrl: ArrayList<String> = ArrayList()
        
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            takeCapture.setOnClickListener(takePictureListener)
    
            getImagesUrl()
        }
    
        private fun getImagesUrl() {
            imagesUrl.apply {
                add("https://image.freepik.com/free-photo/dark-studio-background_1258-14.jpg")
                add("https://i.pinimg.com/236x/e7/f6/47/e7f647952cc3f7381d0707965e422db0.jpg")
                add("https://image.freepik.com/free-vector/abstract-dark-black-background-studio-room-with-sportlight_1035-18643.jpg")
                add("https://thumbs.dreamstime.com/z/empty-black-studio-room-dark-background-abstract-texture-product-showcase-spotlight-gallery-136762537.jpg")
            }
            initRecyclerView()
        }
    
        private fun initRecyclerView() {
            recyclerView = findViewById(R.id.recyclerView)
            recyclerView.apply {
                layoutManager = LinearLayoutManager(applicationContext, LinearLayoutManager.HORIZONTAL, false)
                adapter = ImageAdapter(applicationContext, imagesUrl)
            }
        }
    
        private val takePictureListener = View.OnClickListener {
            val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
            startActivityForResult(intent, 0)
        }
    
        override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
            super.onActivityResult(requestCode, resultCode, data)
    
            val bitmap = data!!.extras!!.get("data") as Bitmap
            val resized = Bitmap.createScaledBitmap(bitmap, 700, 550, true)
            imageView.setImageBitmap(resized)
        }

}

還有我的 RecyclerView 適配器 class

class ImageAdapter(private val context: Context, private val list: ArrayList<String>) : RecyclerView.Adapter<ImageAdapter.ViewHolder>() {

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

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        Picasso.get().load(list[position]).into(holder.circleImageView)
    }

    override fun getItemCount(): Int = list.size

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val circleImageView : CircleImageView = itemView.circleImage
    }
}

在這里,我使用了帶有接口的回調方法,在單擊 recyclerView 中的任何項目時,您將獲得回調,並且您可以在活動中使用該回調進行相應的更改。

您的 MainActivity class 將變成這樣:-

class MainActivity : AppCompatActivity():ImagesAdapter.OnItemClickListener {

    private lateinit var recyclerView: RecyclerView
    private var imagesUrl: ArrayList<String> = ArrayList()
    private lateinit var imageAdapter:ImageAdapter
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        takeCapture.setOnClickListener(takePictureListener)

        getImagesUrl()
    }

    private fun getImagesUrl() {
        imagesUrl.apply {
            add("https://image.freepik.com/free-photo/dark-studio-background_1258-14.jpg")
            add("https://i.pinimg.com/236x/e7/f6/47/e7f647952cc3f7381d0707965e422db0.jpg")
            add("https://image.freepik.com/free-vector/abstract-dark-black-background-studio-room-with-sportlight_1035-18643.jpg")
            add("https://thumbs.dreamstime.com/z/empty-black-studio-room-dark-background-abstract-texture-product-showcase-spotlight-gallery-136762537.jpg")
        }
        initRecyclerView()
    }

    private fun initRecyclerView() {
        recyclerView = findViewById(R.id.recyclerView)
        recyclerView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)        //Your activity's context
        imageAdapter = ImageAdapter(this, imagesUrl)        //Your activity's context
        recyclerView.adapter = imageAdapter
        imageAdapter.setOnItemClickListener(this)
    }

    private val takePictureListener = View.OnClickListener {
        val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        startActivityForResult(intent, 0)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        val bitmap = data!!.extras!!.get("data") as Bitmap
        val resized = Bitmap.createScaledBitmap(bitmap, 700, 550, true)
        imageView.setImageBitmap(resized)
    }

    override fun onItemClicked(backroundImage:String){
        Picasso.get().load(backroundImage).into(imageView)         //Here pass the image view of your activity class
    }

}

您的適配器 class 更改將如下所示:-

class ImageAdapter(private val context: Context, private val list: ArrayList<String>) : RecyclerView.Adapter<ImageAdapter.ViewHolder>() {
   
    private lateinit var onItemClickListener:OnItemClickListener

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

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        Picasso.get().load(list[position]).into(holder.circleImageView)
    }

    override fun getItemCount(): Int = list.size

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val circleImageView : CircleImageView = itemView.circleImage
        itemView.setOnItemClickListener{
            if (::onItemClickListener.isInitialized)
                onItemClickListener.onItemClicked(list[adapterPosition])
        }
    }


    interface OnItemClickListener{
        fun onItemClicked(background:String)
    }

    fun setOnItemClickListener(onItemClickListener:OnItemClickListener){
        this.onItemClickListener = onItemClickListener
    }
}

最簡單的解決方案是將MainActivity的引用傳遞給ImageAdapter

// Change ImageAdapter's constructor to
class ImageAdapter(
  private val context: Context, 
  private val list: ArrayList<String>,
  private val activity: MainActivity
)

// In MainActivity
adapter = ImageAdapter(applicationContext, imagesUrl, this)

MainActivity添加一個更改背景的公共方法:

fun changeBackground(drawable: Drawable) {
  // Change MainActivity's background
}

並在ImageAdapter中調用該方法:

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
  ...
  activity.changeBackground()
}

您可能還想將ImageAdapterMainActivity分離,並將回調 function(例如(Drawable) -> Unit傳遞給ImageAdapter 在這種情況下, MainActivity會將 lambda 傳遞給ImageAdapter的構造函數,並且ImageAdapter將在 onClickListener 中調用onClickListener

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM