Кто-нибудь получил notifyDataSetChanged (), работающий в Kotlin? - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть RecyclerView, который отображает список коротких фраз, прочитанных из MutableList modSamplePhrases . При нажатии на элемент появляется всплывающее DialogFragment, которое показывает фразу из элемента списка и позволяет ее редактировать. Когда редактирование завершено, новый текст возвращается в RecyclerFragment через функцию getDataFromDialog(). Logcat показывает, что базовые данные успешно обновляются (поэтому .clear() & .addAll() не имеет значения), но все равно вызов notifyItemChanged(pos) или notifyDataSetChanged() просто ничего не делает.

class PhraseRecyclerFragment : Fragment(){

    private var modSamplePhrases = PhraseData().samplePhrases

    private var phraseListAdapter = PhraseListAdapter(modSamplePhrases)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        retainInstance = true
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =
        inflater.inflate(R.layout.fragment_recycler, container, false)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
       list_recycler_view.apply {
            layoutManager = LinearLayoutManager(activity)
            adapter = phraseListAdapter
        }

        list_recycler_view.addOnItemClickListener(object: OnItemClickListener {
            override fun onItemClicked(position: Int, view: View) {
                val newFragment = PhraseDialogFragment()
                val args = Bundle()
                args.putInt("POSITION", position)
                args.putString("CONTENT", modSamplePhrases[position].sample)
                newFragment.arguments = args
                val fm = fragmentManager
                newFragment.show(fm, "STF")
            }
        })
    }

    fun getDataFromDialog(pos: Int, dialogText: String) {
        modSamplePhrases[pos].sample = dialogText
        println("item " + pos + ": " + modSamplePhrases[pos].sample)
        phraseListAdapter.notifyDataSetChanged()
    }

Я попытался воссоздать адаптер после изменения данных

phraseListAdapter = PhraseListAdapter(modSamplePhrases)

Я также попытался получить ссылку на RecyclerView и сбросить адаптер на нем

recyclerView?.adapter = phraseListAdapter

Но все равно ничего.

PhraseListAdapter код:

class PhraseViewHolder(inflater: LayoutInflater, parent: ViewGroup) :
    RecyclerView.ViewHolder(inflater.inflate(R.layout.list_item, parent, false)) {
    private var indexView: TextView? = null
    private var sampleView: TextView? = null

    init {
        indexView = itemView.findViewById(R.id.text_index)
        sampleView = itemView.findViewById(R.id.text_sample)
    }

    fun bind(phrase: Phrase) {
        indexView?.text = phrase.sample
        sampleView?.text = phrase.index.toString()
    }
}



class PhraseListAdapter (private val list: MutableList<Phrase>) : RecyclerView.Adapter<PhraseViewHolder>(){

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PhraseViewHolder {
        val inflater = LayoutInflater.from(parent.context)
        return PhraseViewHolder(inflater, parent)
    }

    override fun onBindViewHolder(holder: PhraseViewHolder, position: Int) {
        val phrase: Phrase = list[position]
        holder.bind(phrase)
    }

    override fun getItemCount(): Int = list.size

}

´´´

1 Ответ

0 голосов
/ 06 февраля 2020

Facepalm. Проблема заключалась в том, что я вызывал функцию getDataFromDialog() извне фрагмента следующим образом:

PhraseRecyclerFragment().getDataFromDialog(pos, "" + textViewContent.text)

Поэтому мне нужно было поместить функцию в объект-компаньон:

    companion object {
        var modSamplePhrases = PhraseData().samplePhrases
        var phraseListAdapter = PhraseListAdapter(modSamplePhrases)
        fun getDataFromDialog(pos: Int, dialogText: String) {
            modSamplePhrases[pos].sample = dialogText
            phraseListAdapter.notifyDataSetChanged()
        }

, чтобы иметь возможность чтобы вызвать его:

PhraseRecyclerFragment.getDataFromDialog(pos, "" + textViewContent.text)

И теперь все работает как надо. Виноват. Спасибо всем, кто пытался помочь.

...