코틀린 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
    }
}
  • (•́ ✖ •̀)
    알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)