Kotlin RecyclerView во фрагменте - компонент архитектуры навигации - нулевая ошибка - PullRequest
0 голосов
/ 23 июня 2018

Я пытаюсь создать RecyclerView во фрагменте, но получаю нулевую ошибку в RecyclerView. Мне удалось успешно создать фрагмент, используя новый компонент архитектуры навигации с нижней панелью навигации. У меня работает Android Studio Canary 3.2 Beta 1.

Обратите внимание, что я ошибся, потому что я не вижу красных линий в Android Studio.

Ошибка отладки

E / AndroidRuntime: FATAL EXCEPTION: main Процесс: com.projects.arise.mytestapp, PID: 28285 java.lang.RuntimeException: невозможно запустить действие ComponentInfo {com.projects.arise.mytestapp / com.projects.arise.mytestapp.MainActivity}: java.lang.IllegalStateException: rview_keys не должно быть нулевым на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2817) на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2892) atroid.app.ActivityThread.-wrap11 (неизвестный источник: 0) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1593) на android.os.Handler.dispatchMessage (Handler.java:105) на android.os.Looper.loop (Looper.java:164) на android.app.ActivityThread.main (ActivityThread.java:6541) в java.lang.reflect.Method.invoke (родной метод) на com.android.internal.os.Zygote $ MethodAndArgsCaller.run (Zygote.java:240) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:767) Вызывается: java.lang.IllegalStateException: rview_keys не должно быть нулевым в com.projects.arise.mytestapp.MainActivity.onCreate (MainActivity.kt: 55) на android.app.Activity.performCreate (Activity.java:6975) на android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1213) на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2770) на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2892) atroid.app.ActivityThread.-wrap11 (неизвестный источник: 0) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1593) на android.os.Handler.dispatchMessage (Handler.java:105) на android.os.Looper.loop (Looper.java:164) на android.app.ActivityThread.main (ActivityThread.java:6541) в java.lang.reflect.Method.invoke (родной метод) на com.android.internal.os.Zygote $ MethodAndArgsCaller.run (Zygote.java:240) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:767)

MainActivity.kt

class MainActivity : AppCompatActivity() {

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

        val host: NavHostFragment = supportFragmentManager
                .findFragmentById(R.id.nav_host_fragment) as NavHostFragment? ?: return

        val navController = host.navController
        setupBottomNavMenu(navController)
    }

    override fun onSupportNavigateUp(): Boolean {
        return Navigation.findNavController(this, R.id.nav_host_fragment).navigateUp()
    }

    private fun setupBottomNavMenu(navController: NavController) {
        findViewById<BottomNavigationView>(R.id.navigation)?.let { bottomNavView ->
            NavigationUI.setupWithNavController(bottomNavView, navController)
        }
    }
}

FragmentKeys.kt

class FragmentKeys : Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        setHasOptionsMenu(true)
        return inflater.inflate(R.layout.fragment_keys_layout, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        //val rview_keys: RecyclerView = findViewById(R.id.rview_keys)
        rview_keys.layoutManager = LinearLayoutManager(context)
        rview_keys.adapter = AdapterKeys(KeysListObjects.keys)
    }
}

Я прокомментировал одну строку выше, потому что я получал ошибку «неразрешенная ссылка» на «findViewById». Эта строка, казалось, не была необходима, поскольку это не было в коде других людей. Например: Kotlin Android Fragger recyclerПросмотр и проблема контекста

AdapterKeys.kt

class AdapterKeys(val keys: List<KeysList>) : RecyclerView.Adapter<AdapterKeys.KeysViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): KeysViewHolder {
        val view = LayoutInflater.from(parent?.context).inflate(R.layout.list_item_keys, parent, false)
        return KeysViewHolder(view)
    }

    override fun getItemCount() : Int {
        return keys.size
    } //override fun getItemCount() = keys.size

    override fun onBindViewHolder(holder: KeysViewHolder, position: Int) {
        val keysList = keys[position]
        holder.setData(keysList, position)
    }

    inner class KeysViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        fun setData(keysList: KeysList?, position: Int) {
            itemView.tview_Keys.text = keysList!!.keysText
        }
    }
}

ModelKeys.kt

object KeysListObjects {
    val keys = listOf<KeysList>(
            KeysList("Testing1"),
            KeysList("Testing2"),
            KeysList("Testing3")
    )
}

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

Мне пришлось сделать две вещи, чтобы заставить это работать:

  1. Переместить две строки кода rview_keys из onActivityCreated в onViewCreated (что, как я полагаю, ранее в жизненном цикле фрагмента).Спасибо вышеупомянутым постерам за их отзывы здесь!Так что теперь мой класс фрагмента выглядит так:

FragmentKeys.kt

class FragmentKeys : Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        setHasOptionsMenu(true)
        return inflater.inflate(R.layout.fragment_keys_layout, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        rview_keys.layoutManager = LinearLayoutManager(context)
        rview_keys.adapter = AdapterKeys(KeysListObjects.keys)
    }
}
Я все еще получал ошибки сборки, поэтому я попытался изменить одну из зависимостей Kotlin в моем файле build.gradle (jdk7) до того, что было раньше даже (jre7), хотя я получал предупреждение об устаревании.

Новая зависимость, которую меня просили использовать - которая не работала:

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

Старая зависимость, на которую я переключился, - которая работает (на данный момент):

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
0 голосов
/ 23 июня 2018

вы получаете сообщение об ошибке, потому что вы прокомментировали это

// val rview_keys: RecyclerView = findViewById (R.id.rview_keys)

нет объявления rview_keys в качестве переменной.Поэтому он рассматривает rview_keys как представление, потому что в вашей деятельности у вас есть представление с идентификатором rview_keys .

Следующие строки из ошибки просто подтверждают это.

java.lang.IllegalStateException: rview_keys не должен быть нулевым в com.projects.arise.mytestapp.MainActivity.onCreate (MainActivity.kt: 55) в

Проверить код в строке номер 55 MainActivity.

Причина, по которой у этих людей нет этой линии, заключается в том, что они используют ее как представление.И вы не можете использовать его как представление в onActivityCreated ().

...