Нулевая ссылка на объект для ArrayAdapter - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь адаптировать ArrayList к AutoCompleteTextView во фрагменте. У меня это работало в другой программе, где я применяю адаптер в MainActivity.

Я получаю ошибку:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.AutoCompleteTextView.setAdapter(android.widget.ListAdapter)' on a null object reference

Код моего фрагмента - newFlightFrament.kt:

package com.android.joncb.flightlogbook

import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.widget.ArrayAdapter
import com.android.joncb.flightlogbook.ExtFunctions.CreateList
import com.android.joncb.flightlogbook.dto.AirlineDTO
import com.google.gson.GsonBuilder
import kotlinx.android.synthetic.main.fragment_new_flight.*


private const val ARG_PARAM1 = "airlines"

class newFlightFragment : Fragment() {
    // TODO: Rename and change types of parameters
    private var param1: String? = null
    private var airlineNameOnly = ArrayList<String>()
    private var airlineFSCodeOnly = ArrayList<String>()


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

        arguments?.let {
            param1 = it.getString(ARG_PARAM1)

 //           Log.e("args", param1)

            println(param1)

            val gson = GsonBuilder().create()

            val tempList :List<AirlineDTO> = gson.fromJson(param1,Array<AirlineDTO>::class.java).toList()
            val airlines :ArrayList<AirlineDTO> = arrayListOf(AirlineDTO())
            airlines.addAll(tempList)

            airlineNameOnly = CreateList(airlines, "airlineName")!!
            airlineFSCodeOnly = CreateList(airlines, "FS")!!


        }

//        val adapter = context?.let {
//            ArrayAdapter<String>(
//                it,
//                android.R.layout.simple_list_item_1,
//                airlineNameOnly
//            )
//        }

    val adapter = ArrayAdapter<String>(requireActivity().baseContext,android.R.layout.simple_list_item_1,airlineNameOnly)
        actxtAirlineName.setAdapter(adapter)

    }




}

Мой фрагмент XML - frag_new_flight. xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorPrimary"
    tools:context=".newFlightFragment">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/lblNewFlightInstruction"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingStart="@dimen/abPadding"
            android:text="@string/lblNewFltInstr"
            android:textSize="@dimen/medFont"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="@dimen/abPadding"
            android:paddingVertical="8dp"
            android:text="@string/airline_name"
            android:textSize="@dimen/medFont"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/lblNewFlightInstruction" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="@dimen/abPadding"
            android:paddingVertical="8dp"
            android:text="@string/fsCode"
            android:textSize="@dimen/medFont"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/actxtAirlineName" />

        <TextView
            android:id="@+id/textView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="@dimen/abPadding"
            android:paddingVertical="8dp"
            android:text="@string/fltNumber"
            android:textSize="@dimen/medFont"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/etxtFSCode" />

        <AutoCompleteTextView
            android:id="@+id/actxtAirlineName"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:hint="@string/airline_name"
            android:paddingStart="8dp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/textView3"
            app:layout_constraintTop_toTopOf="@+id/textView" />

.
.
.
    </androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>

При установке адаптера возникает ошибка:

actxtAirlineName.setAdapter(adapter)

Примечание в моем Закомментированный раздел выше этого вызова Я попробовал другой подход, который приводит к той же самой ошибке.

Я могу подтвердить, что ArrayList AirlinesNameOnly заполнен правильно.

Любые идеи хорошие идеи.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 04 мая 2020
  1. Вы забыли переопределить onCreateView
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_new_flight, container, false)
    }
Изменить onCreate на onViewCreated, когда представление вызова onCreate не раздувается
0 голосов
/ 04 мая 2020

Я не вижу, где вы надули свой фрагмент. Возможно, есть проблема?

0 голосов
/ 04 мая 2020

Измените свой код в соответствии с моим

Сначала включите это

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

    arguments?.let {
                param1 = it.getString(ARG_PARAM1)

     //           Log.e("args", param1)

                println(param1)

                val gson = GsonBuilder().create()

                val tempList :List<AirlineDTO> = gson.fromJson(param1,Array<AirlineDTO>::class.java).toList()
                val airlines :ArrayList<AirlineDTO> = arrayListOf(AirlineDTO())
                airlines.addAll(tempList)

                airlineNameOnly = CreateList(airlines, "airlineName")!!
                airlineFSCodeOnly = CreateList(airlines, "FS")!!




    //        val adapter = context?.let {
    //            ArrayAdapter<String>(
    //                it,
    //                android.R.layout.simple_list_item_1,
    //                airlineNameOnly
    //            )
    //        }

        val adapter = ArrayAdapter<String>(requireActivity().baseContext,android.R.layout.simple_list_item_1,airlineNameOnly)
            actxtAirlineName.setAdapter(adapter)

}
}

Надеюсь, это будет работать Спасибо! Удачного кодирования!

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