'how to get the position of a click in recycler view and use in fragment to pass it to an activity
my adapter program
class MusicAdapter(private val context: Homefragment, private val musicList: ArrayList<Music>, var listener:OnItemClick? = null, ) : RecyclerView.Adapter<MusicAdapter.Musicholder>() {
class Musicholder(binding: SongviewBinding) : RecyclerView.ViewHolder(binding.root) {
val title = binding.songname
val album = binding.albumname
val songimage = binding.songicon
val songduration = binding.duration
val root = binding.root
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MusicAdapter.Musicholder {
return Musicholder(SongviewBinding.inflate(LayoutInflater.from(parent.context),parent, false))
}
override fun onBindViewHolder(holder: MusicAdapter.Musicholder, position: Int) {
val currentmusic = musicList[position]
holder.title.text = currentmusic.title
holder.album.text = currentmusic.album
holder.songduration.text = formatduration(currentmusic.duration)
Glide.with(context)
.load(musicList[position].artUri)
.placeholder(R.drawable.music_icon_splashscreen).centerCrop()
.into(holder.songimage)
holder.root.setOnClickListener{
listener?.onItemclicked(currentmusic)
}
}
override fun getItemCount(): Int {
return musicList.size
}
interface OnItemClick {
fun onItemclicked(musicList: Music){
}
}
}
Now i want to get the position of the musiclist clicked in recyclerview and use it in my fragment to pass it to another activity as an intent. how do get the position as when i try to get the position it only plays the default position.
My fragment code
class Homefragment : Fragment() , MusicAdapter.OnItemClick {
private lateinit var musicAdapter:MusicAdapter
private lateinit var binding: FragmentHomefragmentBinding
companion object{
lateinit var MusicListFA: ArrayList<Music>
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding = FragmentHomefragmentBinding.inflate(inflater, container, false)
binding.Musicrecycler.setHasFixedSize(true)
binding.Musicrecycler.setItemViewCacheSize(20)
binding.Musicrecycler.layoutManager = LinearLayoutManager(context)
MusicListFA = getAllAudio()
musicAdapter = MusicAdapter(this, MusicListFA, this)
binding.Musicrecycler.adapter = musicAdapter
return binding.root
}
@SuppressLint("Range")
private fun getAllAudio() : ArrayList<Music>{
val tempList = ArrayList<Music>()
val selection = MediaStore.Audio.Media.IS_MUSIC+ "!=0" // to check the file is not null
val projection = arrayOf(MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.DURATION,MediaStore.Audio.Media.DATA,MediaStore.Audio.Media.DATE_ADDED,MediaStore.Audio.Media.ALBUM_ID)
val cursor = context?.contentResolver?.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,projection,selection,null,
MediaStore.Audio.Media.DATE_ADDED + " DESC",null)//to get data from the storage and arrange in descending order
if (cursor != null){
if(cursor.moveToFirst())
do {
val titlec = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE))
val albumc = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM))
val idc = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media._ID))
val artistc = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST))
val pathc = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA))
val durationc = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION))
val albumidc = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID)).toString()
val uri = Uri.parse("content://media/external/audio/albumart")
val artUric = Uri.withAppendedPath(uri, albumidc).toString()
val music = Music(title = titlec, album = albumc, artist = artistc, id = idc, path = pathc, duration = durationc, artUri = artUric)
val file = File(music.path)
if(file.exists())
tempList.add(music)
}while (cursor.moveToNext())
cursor.close()
}
return tempList
}
override fun onItemclicked(musicList: Music) {
val intent = Intent(context, Playeractivity::class.java)
intent.putExtra("class", "MusicAdapter")
ContextCompat.startActivity(context!!, intent,null)
}
}
Solution 1:[1]
interface OnItemClick {
fun onItemclicked(musicList: Music,itemPosition: Int){
}
}
and
holder.root.setOnClickListener{
listener?.onItemclicked(currentmusic,position)
}
then Activity or Fragment with
override fun onItemclicked(musicList: Music,position: Int) {
// your item position and programming
val intent = Intent(context, Playeractivity::class.java)
intent.putExtra("class", "MusicAdapter")
ContextCompat.startActivity(context!!, intent,null)
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Arda Kazancı |
