данные свойства lateinit не были инициализированы - PullRequest
0 голосов
/ 30 марта 2019

Конвертируемые данные Gson не устанавливаются в Recyclerview с использованием Retrofit2 и rxjava2, а затем подписываются через команду «Ошибка выдачи»:

UninitializedPropertyAccessException: lateinit property data has not been initialized

Синтаксический анализ данных JSON с помощью retrofit2 и rxjava2.при синтаксическом анализе GSON Data Converting GSon, rxjava2 Подпишите данные, затем укажите ошибку свойства lateinit, и они не устанавливаются в обзоре переработчика.

MainActivity.kt

class Company : AppCompatActivity() {


    internal lateinit var api : APIInterface

    var compositeDisposable = CompositeDisposable()



    internal lateinit var companyDialog : Dialog

    internal lateinit var adapter: CompanyAdapter

    internal lateinit var data : List<Company>

    internal lateinit var rvCompany : RecyclerView

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

        companyDialog = Dialog(this)

        //companyAdapter = CompanyAdapter()


        btnSelectCompany.setOnClickListener{
            showCompanyPopupView()
        }



    }

    fun showCompanyPopupView(){
        companyDialog.setContentView(R.layout.compny_popup_screen)

         rvCompany  = companyDialog.findViewById(R.id.rvCompany)

        rvCompany.setHasFixedSize(true)
        rvCompany.layoutManager = LinearLayoutManager(this) as RecyclerView.LayoutManager?

        fetchData()
        companyDialog.window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
        companyDialog.show()
    }

    private fun fetchData(){

        val retrofit = APIClient.apIClient
        if (retrofit != null) {
            api = retrofit.create(APIInterface::class.java)
        }
        compositeDisposable.add(api.getCompanyData()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe ({ companyList-> displayData(data)
                },{
                    Toast.makeText(applicationContext, it.message, Toast.LENGTH_SHORT).show()
                })

        )

    }


    private fun displayData(companyList: List<Company>) {


        adapter = CompanyAdapter(this,companyList)
        rvCompany.adapter = adapter

    }


}

CompanyAdapter.kt

class CompanyAdapter(internal var context: Context, internal var companyList: List<Company>)
    :RecyclerView.Adapter<CompanyAdapter.CompanyViewHolder>()
{
    override fun onCreateViewHolder(p0: ViewGroup, p1: Int): CompanyViewHolder {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.

        val itemView = LayoutInflater.from(p0.context).inflate(R.layout.list_view_item,p0,false)

        return CompanyViewHolder(itemView)
    }

    override fun getItemCount(): Int {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        return companyList?.size!!
    }

    override fun onBindViewHolder(p0: CompanyViewHolder, p1: Int) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.

       // p0.rbButton.text = this!!.companyList?.get(p1)?.Cmp_Name
        p0.bindModel(companyList[p1])
    }

    inner class CompanyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){

        val radioButton : RadioButton = itemView.findViewById(R.id.rbCompanyName)

        fun bindModel(company: Company){

            radioButton.text = company.Cmp_Name
        }
    }



}

Ответы [ 2 ]

1 голос
/ 30 марта 2019

Ошибка возникает из-за того, что вы никогда не инициализируете ее (data = ...), но получаете доступ к ней в { companyList-> displayData(data) }.Это игнорирует companyList, которое вы получаете от subscribe, что, вероятно, совсем не то, что вы на самом деле хотите.

Кажется, ваш код слишком много использует lateinit.Используйте его, когда вам действительно нужно.

0 голосов
/ 30 марта 2019

Вы используете неинициализированную переменную data в функции displayData(data).Вместо этого передайте companyList, что вы получаете от функции subscribe, следующим образом.

 private fun fetchData(){

        val retrofit = APIClient.apIClient
        if (retrofit != null) {
            api = retrofit.create(APIInterface::class.java)
        }
        compositeDisposable.add(api.getCompanyData()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe ({ companyList-> displayData(companyList)
                },{
                    Toast.makeText(applicationContext, it.message, Toast.LENGTH_SHORT).show()
                })

        )

    }

Также вы можете сначала сохранить companyList, который вы получили в переменной data, прежде чем использовать ее, чтобы избежатьошибка.Это поможет вам использовать это companyList в каком-то другом месте в классе Company вместо просто передачи функции.

compositeDisposable.add(api.getCompanyData()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe ({ companyList-> 
                        data = companyList
                        displayData(data)
                },{
                    Toast.makeText(applicationContext, it.message, Toast.LENGTH_SHORT).show()
                })

        )
...