ListView ID вызван на ноль? (Kotlin) - PullRequest
0 голосов
/ 16 января 2020

Я новичок в Kotlin, и я пытаюсь построить HomePage, где есть BottomNavigation с 3 Fragment страницами, но на 1 из страниц я устанавливаю ListView и всякий раз, когда я вызываю Идентификатор, который он дает следующим ошибкам (Caused by: java.lang.IllegalStateException: categoryListView must not be null)

Вот как я называю это на моей домашней странице, где и появляется контент:

class HomePage : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

    lateinit var adapter : CategoryAdapter

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

        adapter = CategoryAdapter(this, DataService.categories)
        categoryListView.adapter = adapter

        navView.setNavigationItemSelectedListener(this)

        bottomNavigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)

        replaceFragment(HomeFragment())
    }

    private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
        when(item.itemId) {
            R.id.Bottom_Nav_Home -> {
                println("Home pressed")
                replaceFragment(HomeFragment())
                return@OnNavigationItemSelectedListener true
            }
            R.id.Bottom_Nav_Notifs -> {
                println("Notification pressed")
                replaceFragment(NotifsFragment())
                return@OnNavigationItemSelectedListener true
            }
            R.id.Bottom_Nav_List -> {
                println("List pressed")
                replaceFragment(ListFragment())
                return@OnNavigationItemSelectedListener true
            }
        }
        false
    }

    private fun replaceFragment(fragment: Fragment) {
        val fragmentTransaction = supportFragmentManager.beginTransaction()
        fragmentTransaction.replace(R.id.NavPageFragment, fragment)
        fragmentTransaction.commit()
    }
}

Я правильно делаю? или я должен вызывать categoryListView в другом месте? потому что я попытался в своем ListFragment, где находится мой код активности, и он выдал ошибку контекста

, вот как выглядит действие фрагмента:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/Bottom_List"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Fragments.ListFragment">

    <ListView
        android:id="@+id/categoryListView"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

1 Ответ

0 голосов
/ 16 января 2020

Вы пытаетесь разрешить categoryListView внутри действия, но это (насколько я понимаю) часть фрагмента. Это просто не работает.

CategoryAdapter и ListView должны использоваться внутри вашего HomeFragment класса, и тогда это будет работать.

Итак, переместите этот код в свой фрагмент:

adapter = CategoryAdapter(this, DataService.categories)
categoryListView.adapter = adapter

Обновление

Я бы переместил его в метод onViewCreated(). Там вы можете просто положиться на тот факт, что есть представление, доступное с контекстом.

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    adapter = CategoryAdapter(view.context, DataService.categories)
    categoryListView.adapter = adapter // categoryListView will be not null here
}
...