Списки проходят по значению? - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь сделать копию своего списка, который содержит в себе массивы, но когда я редактирую скопированное значение, исходные значения меняются, что означает, что я передаю свой ref, я пробовал все виды методов, таких как использование метод копирования для каждого элемента или создание списка / изменяемого списка из оригинала, но он не работает, поэтому мой вопрос: как передать значение в kotlin вместо ref?

Я сделал оригинал как val и его поле тоже.

class FAQAdapter(val faqModel: MutableList<FAQSection>) : RecyclerView.Adapter<FAQAdapter.ViewHolder>() {

    val faqOriginal: List<FAQSection>
    var faqSectionsCopy: MutableList<FAQSection>

    init {
        faqOriginal = faqModel
        faqSectionsCopy = faqModel.toMutableList()
    }

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

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

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

        holder.faqSectionHeading.text =
                faqSectionsCopy.get(holder.adapterPosition).sectionheader

        holder.questionsRecyclerView.layoutManager =
                LinearLayoutManager(holder.itemView.context,
                        LinearLayoutManager.VERTICAL, false)

        holder.questionsRecyclerView.adapter =
                FAQQuestionsAdapter(faqSectionsCopy.get(holder.adapterPosition)
                        .faqQuestions)

        holder.questionsRecyclerView.setHasFixedSize(true)

        holder.questionsRecyclerView.minimumHeight = convertDpToPx(holder.itemView.context, 88) * faqSectionsCopy.get(holder.adapterPosition).faqQuestions.size

    }

    fun filter(text: String) {
        var text = text.trim().toLowerCase()
//        faqSectionsCopy.clear()

        if (text.isEmpty()) {
//            faqSectionsCopy = faqModel as ArrayList<FAQSection>
        } else {
            text = text.toLowerCase()

            faqSectionsCopy.map {
                faqSectionsCopy[0].faqQuestions = it.faqQuestions.filter { it.question.contains(text) } as ArrayList<FAQQuestion>
            }

        }
        notifyDataSetChanged()
    }

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var questionsRecyclerView = itemView.faqQuestionsRecyclerView
        var faqSectionHeading = itemView.faqHeading
    }
}

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Фактически каждый проход данных в Java / Kotlin осуществляется по значению. За исключением того, что в этой ситуации вы передаете ссылку по значению, но не сам список.

Чтобы передать копию списка, вы можете

  • передано с использованием yourList.toList(), который создаст копию списка и вернет неизменный список
  • явно создать новый изменяемый ArrayList(yourList)
0 голосов
/ 29 октября 2018

Вы не можете передавать данные по значению в Kotlin или Java . Вместо этого вы должны убедиться, что работаете с копией при извлечении данных:

fun withList(listOfLists: List<List<Any>>) {
    ...
    val list = listOfLists[0].toMutableList()
    ...
}

Функция расширения toMutableList создаст изменчивую копию списка и, следовательно, оригинал не изменится. Поскольку оба уровня параметра имеют тип List, значения сами по себе неизменны.

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