코틀린 RecyclerView 클릭 이벤트에서 선택한 항목의 특정 데이터 값을 MainActivity의 textView에 설정하려면 어떻게 해야하나요?
조회수 731회
데이터는 리사이클러뷰 아이템에 저장했던 제목입니다.
이 제목을 MainMusic의 textView에 출력하고 싶습니다.
처음에 MusicAdapter에 var mainMusic: MainMusic? = null
을 선언하고
목록 클릭 이벤트에서 this.currentTitle = music.title
아래에 mainMusic?.binding?.musicTitle?.text = music.title
을 추가해주었습니다. 그리고 mainMusic의 startProcess() 내부에 adapter.mainMusic = MainMusic()
으로 어댑터에 넘겨주었습니다.
앱을 실행해서 목록을 클릭하면java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.LayoutInflater android.view.Window.getLayoutInflater()' on a null object reference 오류가 발생하면서 종료됩니다. 어떻게 해야할까요.?
아래는 소스 코드입니다.
MusicAdapter.kt
class MusicAdapter: RecyclerView.Adapter<MusicAdapter.Holder>() {
var musicList = mutableListOf<Music>()
var mediaPlayer: MediaPlayer? = null
var currentTitle: String? = null
var mainMusic: MainMusic? = null // mainMusic 객체를 저장할 변수
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
val binding = ItemMusicListBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return Holder(binding)
}
override fun getItemCount(): Int {
return musicList.size
}
override fun onBindViewHolder(holder: Holder, position: Int) {
var music = musicList[position]
holder.setContent(music)
// 목록 클릭 이벤트 부분
holder.binding.root.setOnClickListener {
if(mediaPlayer != null) {
mediaPlayer?.release()
mediaPlayer = null
}
// MainMusic이라는 MainActivity의 textView인 musicTitle에 제목을 출력하려고 합니다.
mainMusic?.binding?.musicTitle?.text = music.title // 클릭 했을 때 title 값 대입
mediaPlayer = MediaPlayer.create(holder.binding.root.context, holder.musicUri)
mediaPlayer?.start()
}
}
// 리사이클러뷰 Holder 클래스
inner class Holder(val binding: ItemMusicListBinding): RecyclerView.ViewHolder(binding.root) {
var musicUri: Uri? = null
fun setContent(music: Music) {
binding.imageListAlbum.setImageURI(music.getAlbumUri())
binding.textListTitle.text = music.title
binding.textListArtist.text = music.artist
var duration = SimpleDateFormat("mm:ss").format(music.duration)
binding.textListTime.text = duration
this.musicUri = music.getMusicUri()
}
}
}
MainMusic.kt -> MainActivity 입니다.
class MainMusic : BaseActivity() {
override fun permissionGranted(requestCode: Int) {
startProcess()
}
override fun permissionDenied(requestCode: Int) {
Toast.makeText(this, "음원 목록을 불러오기 위해서는 외부 저장소의 권한이 필요합니다.", Toast.LENGTH_SHORT).show()
}
val binding by lazy {MusicMainBinding.inflate(layoutInflater)}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
val permissions = arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE)
requirePermissions(permissions, 999)
}
fun startProcess() { // 리사이클러뷰 어댑터를를 연결하는 부분
var adapter = MusicAdapter()
adapter.musicList.addAll(getMusicList())
adapter.mainMusic = MainMusic() // 어댑터에 액티비티를 넘겨줍니다.
binding.recyclerMusic.adapter = adapter
binding.recyclerMusic.layoutManager = LinearLayoutManager(this)
}
fun getMusicList(): List<Music> { // 음원 목록을 가져오는 메서드
var listUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
var proj = arrayOf(
MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.ALBUM_ID,
MediaStore.Audio.Media.DURATION,
)
val cursor = contentResolver.query(listUri, proj, null, null, null)
val musicList = mutableListOf<Music>()
while (cursor?.moveToNext() == true) {
var id = cursor.getString(0)
var title = cursor.getString(1)
var artist = cursor.getString(2)
var albumId = cursor.getString(3)
var duration = cursor.getLong(cursor.getColumnIndex("DURATION"))
val music = Music(id, title, artist, albumId, duration)
musicList.add(music)
}
return musicList
}
}
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력