ListView во фрагменте Ошибка Kotlin - PullRequest
0 голосов
/ 10 мая 2018

Новый для КТ.У меня возникли некоторые ошибки при реализации моего списка.Не совсем уверен, почему у меня такие проблемы.Это потому, что он расширяет фрагмент?Может ли кто-нибудь указать мне правильное направление?

import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ListView
import android.widget.ArrayAdapter

class Chatroom : Fragment() {

    private lateinit var listView ListView

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {

        var listView = findViewById(R.id.chatroom_list_view) as ListView

        val testList = "hu, tu, su, send, pe, t"

        val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, testList)
        listView.adapter = adapter


        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.chatroom, container, false)
    }

Ошибки

Изображение ошибок

.xml

<ListView
            android:id="@+id/chatroom_list_view"
            android:layout_width="368dp"
            android:layout_height="436dp"
            android:layout_marginBottom="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginLeft="8dp"
            android:layout_marginRight="8dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            app:layout_constraintBottom_toTopOf="@+id/messageTextField"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/search" />

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Несколько вещей, на которые следует обратить внимание:

private lateinit var listView ListView

Это приводит к ошибке, поскольку вы не указали тип объекта "listView".

В kotlin типы объектов:указывается после двоеточия, продолжающего имя объекта, т.е.

private lateinit var listView: ListView

Далее,

listView = rootView.findViewById(R.id.chatroom_list_view) as ListView

Kotlin использует расширения kotlin (kotlinx), которые ищут вашу иерархию представления в контексте для идентификатора, которыйпринадлежит типу объекта, которому он назначается.то есть.Достаточно просто сказать

listView = rootView.chatroom_list_view

, где rootView равен

rootView = inflater.inflate(R.Layout.chatroom, container, false)

, который должен быть объявлен до , когда вы используете дочерние элементы из этого представления.

Следующая вещь

val testList = "hu, tu, su, send, pe, t"

неявно имеет тип String

Если вы проверите документацию , ArrayAdapter (объявленный так, как вы хотите) занимает нескольковводит в качестве третьего параметра, строка которого не упоминается.

Обратитесь к руководству Kotlin reference , чтобы увидеть, как объявляется массив строк.

И последнее, что нужно сделатьпримечание

ArrayAdapter(this,..,..)

В этой области это - ваш фрагмент.Что не является контекстом.Используйте:

context

, который вызывает метод свойства get для фрагмента getContext () .Или:

activity

, который возвращает контекст вашей активности.

0 голосов
/ 10 мая 2018

Измените свой код следующим образом.

class Chatroom : Fragment() {

private lateinit var listView: ListView

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {
    val rootView = inflater.inflate(R.layout.chatroom, container, false)

    listView = rootView.findViewById(R.id.chatroom_list_view)

    val testList = arrayOf("hu", "tu", "su", "send", "pe", "t")

    val adapter = ArrayAdapter(context, android.R.layout.simple_list_item_1, testList)
    listView.adapter = adapter


    return rootView
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...