#kotlin #android-recyclerview
#kotlin #android-recyclerview
Вопрос:
Я использую RecyclerView для отображения динамического списка данных, и после вызова API мне нужно обновить пользовательский интерфейс RecyclerView, но элементы в моем RecyclerView не меняются…
Ниже показано, как я инициализирую свой RecyclerView в своем фрагменте:-
forwardedList.layoutManager = LinearLayoutManager(context!!, RecyclerView.VERTICAL, false)
adapter = ForwardListAdapter(SmsHelper.getForwardedSms(context!!))
forwardedList.adapter = adapter
Ниже приведен мой пользовательский адаптер RecyclerView:-
class ForwardListAdapter(val forwardedList: List<SmsData>) : RecyclerView.Adapter<ForwardListAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ForwardListAdapter.ViewHolder {
val v = LayoutInflater.from(parent.context).inflate(R.layout.forwarded_item, parent, false)
return ViewHolder(v)
}
override fun onBindViewHolder(holder: ForwardListAdapter.ViewHolder, position: Int) {
holder.bindItems(forwardedList[position])
}
override fun getItemCount(): Int {
return forwardedList.size
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bindItems(sms: SmsData) {
val simSlotText: TextView = itemView.findViewById(R.id.simSlot)
val senderText: TextView = itemView.findViewById(R.id.sender)
simSlotText.text = "[SIM ${sms.simSlot}] "
senderText.text = sms.sender
}
}
}
В настоящее время я обновляю свой RecyclerView из класса SmsHelper, как показано ниже:-
val fragments = mainActivity!!.supportFragmentManager.fragments
for (f in fragments) {
if (f.isVisible) {
if (f.javaClass.simpleName.equals("ForwardedFragment")) {
val fg = f as ForwardedFragment
fg.adapter.notifyDataSetChanged() <----- HERE
} else if (f.javaClass.simpleName.equals("FailedFragment")) {
val fg = f as FailedFragment
fg.adapter.notifyDataSetChanged()
}
}
}
Комментарии:
1. можете ли вы добавить код, в который вы на самом деле вызываете
adapter.notifyDataSetChanged()
, пожалуйста?2. Привет, я отредактировал и добавил код
Ответ №1:
Как я заметил, вы на самом деле не изменили данные адаптера, а только вызвали notifyDataSetChanged
. Вы не можете просто ожидать, что данные будут изменены автоматически, поскольку notifyDataSetChanged
только:
Уведомляет подключенных наблюдателей о том, что базовые данные были изменены, и любое представление, отражающее набор данных, должно обновиться само.
Сначала вам нужно изменить данные самостоятельно, а затем вызвать notifyDataSetChanged
.
class ForwardListAdapter(private val forwardedList: MutableList<SmsData>) : RecyclerView.Adapter<ForwardListAdapter.ViewHolder>() {
// ...
fun setData(data: List<SmsData>) {
forwardedList.run {
clear()
addAll(data)
}
}
// ...
}
Затем сделайте это следующим образом:
adapter.run {
setData(...) // Set the new data
notifyDataSetChanged(); // notify changed
}