NPE при использовании синтетических функций для доступа к представлению - PullRequest
0 голосов
/ 29 сентября 2019
 class CrimeListFragment:Fragment() {
    private inner class CrimeAdapter(var crimes:List<Crime>):RecyclerView.Adapter<crimeViewHolder>(){
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): crimeViewHolder {
            val view= layoutInflater.inflate(R.layout.list_item_crime,parent,false)
            return crimeViewHolder(view)
        }
        override fun getItemCount(): Int {
            return  crimes.size
        }
        override fun onBindViewHolder(holder: crimeViewHolder, position: Int) {
            val crime=crimes[position]
            holder.apply {
              (line 80)  crime_title.setText(crime.title)
                crime_date.setText(crime.date.toString())
            }
        }

      }
    }

Это реализация для представления переработчика в классе CrimeListFragment.Выдает ошибку NPE как

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
    at com.example.criminalintent.CrimeListFragment$CrimeAdapter.onBindViewHolder(CrimeListFragment.kt:80)
    at com.example.criminalintent.CrimeListFragment$CrimeAdapter.onBindViewHolder(CrimeListFragment.kt:66)

. Это представление, к которому я обращаюсь

    <?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:tool="http://schemas.android.com/tools"
    android:id="@+id/linearLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/crime_title"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tool:text="Crime Title" />

    <TextView
        android:id="@+id/crime_date"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="18dp"
        android:layout_marginBottom="9dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/crime_title"
        tool:text="Crime Date" />

</androidx.constraintlayout.widget.ConstraintLayout>

. Я работаю с фрагментом и получаю такую ​​ошибку, чаще всего некоторые из них уменьшаются надоступ к тем в методе onViewCreated, но я застрял в этом.это вызвано ранним доступом (из-за синтетической функции)

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

Я попытался запустить ваш код и он работает нормально.

package com.example.demo.ui.main

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.demo.R
import kotlinx.android.synthetic.main.list_item_crime.view.*
import kotlinx.android.synthetic.main.main_fragment.*

class CrimeListFragment : Fragment() {

    private lateinit var cadapter: CrimeAdapter

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

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

    private fun setAdapter() {
        cadapter = CrimeAdapter(getCrimeList())
        with(recycler) {
            adapter = cadapter
            layoutManager = androidx.recyclerview.widget.LinearLayoutManager(
                context,
                RecyclerView.VERTICAL,
                false
            )
        }
    }

    private fun getCrimeList(): List<Crime> {
        val list = mutableListOf<Crime>()
        list.add(Crime("Test", "Today"))
        list.add(Crime("Test", "Today"))
        list.add(Crime("Test", "Today"))
        list.add(Crime("TESt", "Today"))

        return list
    }

    private class CrimeAdapter(var crimes:List<Crime>): RecyclerView.Adapter<CrimeAdapter.crimeViewHolder>(){

        override fun onCreateViewHolder(parent: ViewGroup, viewType:Int):crimeViewHolder{
            return crimeViewHolder(
                LayoutInflater.from(parent.context).inflate(
                    R.layout.list_item_crime,
                    parent,
                    false
                )
            )
        }

        override fun getItemCount():Int{
            return crimes.size
        }

        override fun onBindViewHolder(holder:crimeViewHolder,position:Int){
            val crime=crimes[position]
            holder.itemView.apply{
                crime_title.text = crime.title
                crime_date.text = crime.date
            }
        }

        inner class crimeViewHolder(itemView: View):RecyclerView.ViewHolder(itemView) {}
    }

}

макет фрагмента

<?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/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.main.CrimeListFragment">


    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:listitem="@layout/list_item_crime"
        app:layout_constraintTop_toTopOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

list_item_crime такой же, как ваш

0 голосов
/ 29 сентября 2019

При использовании расширений kotlin android от ViewHolder в RecyclerView вы должны получить itemView от держателя просмотра:

override fun onBindViewHolder(holder: crimeViewHolder, position: Int) {
    val crime=crimes[position]
    holder.itemView.apply {
        crime_title.setText(crime.title)
        crime_date.setText(crime.date.toString())
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...