【问题标题】:how to fix conversion error when converting from java to kotlin从java转换为kotlin时如何修复转换错误
【发布时间】:2019-09-04 01:54:46
【问题描述】:

我是一名学生,刚接触 kotlin,所以我正在将 java 代码转换为 kotlin 以学习并查看它是如何工作的,但是我不明白错误的含义。

private val _songs = ArrayList<SongInfo>()
internal lateinit var recyclerView: RecyclerView
internal lateinit var seekBar: SeekBar
internal lateinit var songAdapter: SongAdapter
internal var mediaPlayer: MediaPlayer? = null
private val myHandler = Handler()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    recyclerView = findViewById(R.id.recyclerView) as RecyclerView
    seekBar = findViewById(R.id.seekBar) as SeekBar
    songAdapter = SongAdapter(this, _songs)
    recyclerView.adapter = songAdapter
    val linearLayoutManager = LinearLayoutManager(this)
    val dividerItemDecoration = DividerItemDecoration(recyclerView.context,
            linearLayoutManager.orientation)
    recyclerView.layoutManager = linearLayoutManager
    recyclerView.addItemDecoration(dividerItemDecoration)
    songAdapter.setOnItemClickListener { b, view, obj, position ->
        if (b.text == "Stop") {
            mediaPlayer!!.stop()
            mediaPlayer!!.reset()
            mediaPlayer!!.release()
            mediaPlayer = null
            b.text = "Play"
        } else {

            val runnable = Runnable {
                try {
                    mediaPlayer = MediaPlayer()
                    mediaPlayer!!.setDataSource(obj.songUrl)
                    mediaPlayer!!.prepareAsync()
                    mediaPlayer!!.setOnPreparedListener { mp ->
                        mp.start()
                        seekBar.progress = 0
                        seekBar.max = mediaPlayer!!.duration
                        Log.d("Prog", "run: " + mediaPlayer!!.duration)
                    }
                    b.text = "Stop"


                } catch (e: Exception) {
                }
            }
            myHandler.postDelayed(runnable, 100)

        }
    }
    checkUserPermission()

    val t = runThread()
    t.start()
}

inner class runThread : Thread() {


    override fun run() {
        while (true) {

            try {
                Thread.sleep(1000)
            } catch (e: InterruptedException) {
                e.printStackTrace()
            }

            Log.d("Runwa", "run: " + 1)
            if (mediaPlayer != null) {
                seekBar.post { seekBar.progress = mediaPlayer!!.currentPosition }

                Log.d("Runwa", "run: " + mediaPlayer!!.currentPosition)
            }
        }
    }

}

private fun checkUserPermission() {
    if (Build.VERSION.SDK_INT >= 23) {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), 123)
            return
        }
    }
    loadSongs()
}

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
    when (requestCode) {
        123 -> if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            loadSongs()
        } else {
            Toast.makeText(this, "Permission Denied", Toast.LENGTH_SHORT).show()
            checkUserPermission()
        }
        else -> super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    }

}

private fun loadSongs() {
    val uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
    val selection = MediaStore.Audio.Media.IS_MUSIC + "!=0"
    val cursor = contentResolver.query(uri, null, selection, null, null)
    if (cursor != null) {
        if (cursor.moveToFirst()) {
            do {
                val name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME))
                val artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST))
                val url = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA))

                val s = SongInfo(name, artist, url)
                _songs.add(s)

            } while (cursor.moveToNext())
        }

        cursor.close()
        songAdapter = SongAdapter(this@MainActivity, _songs)

    }
}

}

这是错误:

"Error:(46, 44) 类型不匹配:推断类型为 (???, ???, ???, ???) -> 除了 SongAdapter.OnItemClickListener 之外的任何其他都是预期的错误:(46, 46) 无法推断此参数的类型。请明确指定。”

【问题讨论】:

    标签: android-studio kotlin


    【解决方案1】:

    批量转换为 Kotlin 并不是学习该语言的最佳方式。我建议你在 Kotlin 中手动重新实现你的 Android 组件,以获得语言的感觉。

    您看到的错误是:“我无法理解这个带有 4 个参数的 lambda 怎么可能是 SongAdapter.OnItemClickListener 的实例,请帮忙”。您可以在这个地方尝试匿名课程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-31
      • 2019-03-12
      • 2021-02-03
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-10
      相关资源
      最近更新 更多