How to add items to RecyclerView from EditText, ImageView with onClickListener?

153 Views Asked by At

so I want to make an app, where you can add data such as Image, Video, description and Title from PopupWindow, then by clicking AddButton it will add provided data to recyclerView. I know I need to use notifyItemInserted but i don't know how. The Image will be a thumbnail, Video will be not visible, it will work only on the next fragment with player (i will do it later).

here is a preview of popupWindow and recyclerView behind it.

RecyclerAdapter.kt

class RecyclerAdapter: RecyclerView.Adapter<RecyclerAdapter.MyViewHolder>() {

private var dataList = emptyList<ListData>()

class MyViewHolder(val binding: CardLayoutBinding): RecyclerView.ViewHolder(binding.root)

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
    return MyViewHolder(CardLayoutBinding.inflate(LayoutInflater.from(parent.context), parent,false))
}

override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
    holder.binding.tvTitle.text = dataList[position].title
    holder.binding.tvDescription.text = dataList[position].description
    holder.binding.tvThumbnail // what to do next?
}

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

ListData.kt

data class ListData(
val id: Int,
val title: String,
val description: String,
val image: ImageView,
val Video: VideoView
)

MainActivity.kt

class MainActivity : AppCompatActivity() {
private var dialogView: View? = null

private val getPreviewImage = registerForActivityResult(ActivityResultContracts.GetContent(), ActivityResultCallback {
    it?.let { uri ->
        dialogView?.findViewById<ImageView>(R.id.imageChange)?.setImageURI(it)
    }?:run {
        Log.e("MainActivity", "URI not present")
    }
})

private val getPreviewVideo = registerForActivityResult(ActivityResultContracts.GetContent(), ActivityResultCallback {
it?.let { uri ->
    dialogView?.findViewById<VideoView>(R.id.videoChange)?.setVideoURI(it)
}?: run{
    Log.e("MainActivity", "URI not present")
    }
})

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    supportActionBar?.hide()

    bottomNavigationView.background = null
    bottomNavigationView.menu.findItem(R.id.placeholder).isEnabled = false
    replaceFragment(HomeFragment())

    bottomNavigationView.setOnItemSelectedListener {
        when (it.itemId) {
            R.id.home -> replaceFragment(HomeFragment())
            R.id.player -> replaceFragment(PlayerFragment())
            R.id.profile -> replaceFragment(ProfileFragment())
            R.id.settings -> replaceFragment(SettingsFragment())
        }
        true
    }

    popupAddButton.setOnClickListener {
        showDialog()
    }
}


private fun replaceFragment(fragment: Fragment) {
    val transaction = supportFragmentManager.beginTransaction()
    transaction.replace(R.id.fragment_container, fragment)
    transaction.commit()
}
private fun showDialog() { //this is for popupWindow
    dialogView = layoutInflater.inflate(R.layout.popup, null)
    val dialog = Dialog(this)
    val titleEditText = dialogView?.findViewById<EditText>(R.id.titleEdit) //popUp edit field title
    val descEditText = dialogView?.findViewById<EditText>(R.id.description) //popUp edit field description

    dialogView?.addImage?.setOnClickListener {
        getPreviewImage.launch("image/*")

    }
    dialogView?.addVideo?.setOnClickListener {
        getPreviewVideo.launch("video/*")
    }

    dialogView?.addButton?.setOnClickListener {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
        if (titleEditText?.text?.isEmpty() == true || descEditText?.text?.isEmpty() == true){
            Toast.makeText(applicationContext, "add required data", Toast.LENGTH_SHORT).show()
        }else{
            Toast.makeText(applicationContext, "Added", Toast.LENGTH_SHORT).show()
        }
    }
    dialog.setContentView(dialogView!!)
    dialog.show()
   }
}
1

There are 1 best solutions below

1
root On

Don't see any new activity here so i will just drop a code examples so ppl who might encounter this question have some clue for start doing research of their own.

In the fragment where you have your recycler view you might set a listener for fragment result from specific child fragment using a TAG.

This is an example of mine:

childFragmentManager.setFragmentResultListener(
            VisitanteVehiculoFormDialog.TAG,
            viewLifecycleOwner
        ) { key, bundle ->
            val result =
                bundle.getSerializable(VisitanteVehiculoFormDialog.TAG_RESULT) as VisitanteVehiculoSerializale
            _visitanteVehiculoAdapter.insertItem(
                AutomovilVisitante(
                    1,
                    MODELO = result.MODELO,
                    PLACA_TEXTO = result.PLACA_TEXTO,
                    ID_VISITANTE_AUTORIZADO = result.ID_VISITANTE_AUTORIZADO,
                    ID_AUTOMOVIL_VISITANTE = result.ID_AUTOMOVIL_VISITANTE
                )
            )

In my dialog fragment i have the following:

 binding?.buttonCrearVisitanteAutomovil?.setOnClickListener {
            val b = Bundle()
            b.putSerializable(
                TAG_RESULT, VisitanteVehiculoSerializale(
                    MODELO = binding?.etModeloVehiculo2?.text.toString(),
                    PLACA_TEXTO = binding?.etPlacaVehiculo?.text.toString(),
                    ID_VISITANTE_AUTORIZADO = 0,
                    ID_AUTOMOVIL_VISITANTE = 0
                )
            )
            Handler(Looper.getMainLooper()).postDelayed({
                setFragmentResult(TAG, b)
                dismiss()
            }, 1000L)
        }

hope someone find this examples useful.