Функция конкатенации строк в Dataclass не работает должным образом - PullRequest
0 голосов
/ 14 июля 2020

Я уверен, что это простая причина, но я не понимаю, почему функция projectTitleText() в приведенном ниже классе данных не объединяется, как ожидалось, в моем recyclerView:

data class ProjectObject (
    var projectReference: String = "NO REFERENCE",
    var projectTitle: String = "", // e.g. "C & F Beam Reconfiguration"
    var projectDescription: String = "", // e.g. "Order for beam reconfiguration project"
    var projectStatus: String = "Enquiry",
    var projectNotes: String = "",
    var projectTask: Boolean = false,

    var createdBy: String = "",
    var users: HashMap<String, Boolean> = hashMapOf(),
    var sites: HashMap<String, Boolean> = hashMapOf(),
    var contacts: HashMap<String, Boolean> = hashMapOf(),

    @ServerTimestamp
    var dateCreatedTimestamp: Date? = null,
    @ServerTimestamp
    var dateEditedTimestamp: Date? = null,

    @Exclude @set:Exclude @get:Exclude
    var projectID: String = ""

) : Serializable {

    override fun toString(): String {
        return projectReference
    }

    fun projectTitleText(): String {
        var projectTitleText = projectReference
        if (projectTitle.isNotEmpty()) projectTitleText.plus(" - $projectTitle")
        return projectTitleText
    }

}

Я знаю, что в projectTitle есть значение, поэтому функции .isNotEmpty() или .plus() работают не так, как я ожидал ..

В моем адаптере код выглядит так:

    class ProjectViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        fun bind(
            project: ProjectObject,
            clickListener: (ProjectObject) -> Unit,
            longClickListener: (ProjectObject) -> Boolean
        ) {
            // Set text fields
            itemView.projectsItemTitleText.text = project.projectTitle
            itemView.projectsItemDetailsText.text = project.projectDescription
            itemView.projectsItemContactsText.text = project.projectContactsText() // Not working!!
            itemView.projectsStatusButton.text = project.projectStatus

            // Set Task Icon visibility
            if (project.projectTask) itemView.projectsItemTaskImageView.visibility = View.VISIBLE
            else itemView.projectsItemTaskImageView.visibility = View.INVISIBLE

            //Set Status background colour
            when (project.projectStatus) {
                "Enquiry" -> itemView.projectsStatusButton.setBackgroundColor(ContextCompat.getColor(itemView.context, R.color.Enquiry))
                "Quote" -> itemView.projectsStatusButton.setBackgroundColor(ContextCompat.getColor(itemView.context, R.color.Quote))
                "Order" -> itemView.projectsStatusButton.setBackgroundColor(ContextCompat.getColor(itemView.context, R.color.Order))
                "Dead" -> itemView.projectsStatusButton.setBackgroundColor(ContextCompat.getColor(itemView.context, R.color.Dead))
                "Lost" -> itemView.projectsStatusButton.setBackgroundColor(ContextCompat.getColor(itemView.context, R.color.Lost))
            }

            // Set Listeners
            itemView.setOnClickListener { clickListener(project) }
            itemView.setOnLongClickListener { longClickListener(project) }
        }
    }

1 Ответ

1 голос
/ 14 июля 2020

Java (и, следовательно, Kotlin) Строки неизменяемы. Согласно документации , plus

Возвращает строку, полученную путем объединения этой строки со строковым представлением данного другого объекта.

Это означает, что plus не изменит исходную строку (не может), она создаст новую. Поэтому для правильной работы ваш код необходимо изменить на следующий:

fun projectTitleText(): String {
  var projectTitleText = projectReference
  if (projectTitle.isNotEmpty()) projectTitleText = projectTitleText.plus(" - $projectTitle")
  return projectTitleText
}
...