Почему бы не передавать данные между моим пользовательским классом адаптера утилизатора и моим пользовательским классом активности? - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь передать экземпляр пользовательского класса из моего пользовательского класса адаптера утилизатора в пользовательский класс действий, используя parcelize, но не все свойства пользовательского класса передаются правильно. Свойства экземпляра класса, которые не передаются, являются свойствами, которые являются экземплярами другого пользовательского класса, определенного вне основного пользовательского класса. Когда я пытаюсь прочитать значения из второго пользовательского класса, я получаю null

Вот мои пользовательские классы:

package com.riverstonetech.gositeuk.Model

import android.os.Parcelable
import kotlinx.android.parcel.Parcelize

@Parcelize
data class Site(var name: String? = null): Parcelable {

    var address: Address = Address("")
    var description: String? = null
    var locationCoordinate: Coordinate = Coordinate(0.0)
    var distance: Int? = null
    var price: Double? = null

}
package com.riverstonetech.gositeuk.Model

import android.os.Parcelable
import kotlinx.android.parcel.Parcelize

@Parcelize
data class Address(var line1: String? = null): Parcelable {

    var line2: String? = null
    var line3: String? = null
    var line4: String? = null
    var postcode: String? = null
    var phoneNumber: String? = null
    var siteURL: String? = null
}
package com.riverstonetech.gositeuk.Model

import android.os.Parcelable
import kotlinx.android.parcel.Parcelize

@Parcelize
data class Coordinate(var Latitude: Double? = null): Parcelable {
    var Longitude: Double? = null
}

Вот мой пользовательский класс адаптера утилизатора :

package com.riverstonetech.gositeuk

import android.content.Intent
import android.content.res.Resources
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.core.content.ContextCompat.startActivity
import androidx.recyclerview.widget.RecyclerView
import java.text.DecimalFormat

class SiteAdapter(
    private val mainActivity: CountiesActivity,
    private val siteList: List<Site>) : RecyclerView.Adapter<SiteAdapter.ListItemHolder>() {

    inner class ListItemHolder(val view: View):
        RecyclerView.ViewHolder(view),
        View.OnClickListener {

        internal var name = view.findViewById<View>(R.id.textViewSiteName) as TextView

        internal var distance = view.findViewById<View>(R.id.textViewSiteDistance) as TextView

        internal var price = view.findViewById<View>(R.id.textViewSitePrice) as TextView

        init {

            view.isClickable = true
            view.setOnClickListener(this)

        }

        override fun onClick(view: View) {

//            mainActivity.showDetails(adapterPosition)
            val intent = Intent(mainActivity, Details::class.java)
            intent.putExtra("SELECTED_SITE", siteList[adapterPosition])
            startActivity(mainActivity, intent, null)
        }

    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListItemHolder {

        val itemView = LayoutInflater.from(parent.context)
            .inflate(R.layout.recycler_list_item, parent, false)

        return ListItemHolder(itemView)

    }

    override fun getItemCount(): Int {

        if (siteList != null) {
            return siteList.size
        }
        // error
        return -1

    }

    override fun onBindViewHolder(holder: ListItemHolder, position: Int) {

        val site = siteList[position]

        holder.name.text = site.name
        holder.distance.text = site.distance.toString() + holder.view.context.getString(R.string.miles)
        val decimalFormatter = DecimalFormat("#,##0")
        holder.price.text = holder.view.context.getString(R.string.poundSign) + decimalFormatter.format(site.price).toString()

    }


}

и вот мой пользовательский класс активности:

package com.riverstonetech.gositeuk

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import kotlinx.android.synthetic.main.activity_details.*

class Details : AppCompatActivity() {

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

        val site = intent.getParcelableExtra<Site>("SELECTED_SITE")
        Log.i("Info", "${site.name}")

        siteNameTextView.text = site.name

        Log.i("line 1", "${site.address.line1}")


    }
}

Ответы [ 2 ]

0 голосов
/ 31 января 2020

Переместил все мои объявления свойств в основные конструкторы моих 3 пользовательских классов.

0 голосов
/ 30 января 2020

Каждый класс, используемый в вашем Site классе, также должен иметь аннотацию @Parcelize и реализовывать Parcelable. Так что вам нужно добавить это к Address и Coordinate тоже.

...