Адаптер Listview во фрагменте, выдающий исключение нулевого указателя - PullRequest
0 голосов
/ 10 июля 2019

Я сделал просмотр списка во фрагменте. Исключение пустого указателя для адаптера представления списка. Но Arraylist и адаптер не равны нулю.

Ошибка: lvElevator не может быть пустым

Ошибка для строки ниже

lvElevator.adapter = EAdapter

Класс фрагмента


var EList=ArrayList<E1List>()

class EDetails: Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        EList.add(E1List(1))
        EList.add(E1List(2))
        var EAdapter = EleAdapter(EList)
        lvElevator.adapter = EAdapter
        return inflater.inflate(R.layout.fragment_elevators, container, false)

    }

    inner class EleAdapter : BaseAdapter {
        var EListAdapter = ArrayList<E1List>()

        constructor(EListAdapter: ArrayList<E1List>) : super() {
            this.EListAdapter = EListAdapter
        }

        override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
            var myView = layoutInflater.inflate(R.layout.elevator_ticket, null)
            var myEle = EListAdapter[position]
            myView.tvEnum.text = myEle.elevatornum.toString()
            return myView
        }

        override fun getItem(position: Int): Any {
            return EListAdapter[position]
        }

        override fun getItemId(position: Int): Long {
            return position.toLong()
        }

        override fun getCount(): Int {
            return EListAdapter.size
        }

    }
}

1 Ответ

0 голосов
/ 10 июля 2019

Вы пытаетесь определить lvElevator, прежде чем фрагмент раздувает файл макета xml.Это можно исправить двумя способами.

1) Вместо этого используйте метод onViewCreated(), чтобы загрузить данные в представления.И используйте метод onCreateView, чтобы просто накачать только представление.

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    EList.add(E1List(1))
    EList.add(E1List(2))
    var EAdapter = EleAdapter(EList)
    lvElevator.adapter = EAdapter
}

2) Изменить метод onCreateView(), как показано ниже.

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

    // Define views manually..
    val view = inflater.inflate(R.layout.fragment_elevators, container, false)
    val lvElevator = view.findViewById<ListView>(R.id.lvElevator)

    EList.add(E1List(1))
    EList.add(E1List(2))
    var EAdapter = EleAdapter(EList)
    lvElevator.adapter = EAdapter
    return view
}

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

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