【问题标题】:How to pass a list of objects from adapter to activity via broadcast receiver in kotlin如何通过kotlin中的广播接收器将对象列表从适配器传递到活动
【发布时间】:2021-02-16 20:44:48
【问题描述】:

我有一种情况,我需要将一个列表从适配器传递到活动,然后将同一个列表从活动传递到另一个适配器。所以,我将一个列表从适配器传递给这样的活动,它可以工作。

if(filteredList.isNotEmpty()){
var json = Gson().toJson(filteredList)
intentPassList.putExtra("filteredList", json)
LocalBroadcastManager.getInstance(holder.context).sendBroadcast(intentPassList)
}

接下来,我在活动课上像这样成功收到了我的清单

  private val receiverFilteredList = object : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            var recList = intent.getStringExtra("filteredList")
            if (recList != null){
                var token: TypeToken<ArrayList<Model?>?> = object : TypeToken<ArrayList<Model?>?>() {}
                myFilteredList = Gson().fromJson(recList, token.type) // list is received correctly
            }
        }
    }

现在我需要将此接收到的列表传递给另一个适配器(回收器视图),我的想法是在我的活动中的 onCreate 中执行此操作

private var myFilteredList: ArrayList<Model> = arrayListOf()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
LocalBroadcastManager.getInstance(this).registerReceiver(receiverFilteredList, IntentFilter("filteredList"))

 if (myFilteredList?.isNotEmpty() == true){
            adapter = NewAdapter(myFilteredList!!)
            myRecycler?.layoutManager = manager
            myRecycler?.adapter = adapter
        } else {
            adapterInfo = NewAdapter(completeList)
            myRecycler?.layoutManager = manager
            myRecycler?.adapter = adapter
        }
}
}

但它总是将 completeList 发送到适配器,因为 myFilteredList 为空。如何正确地将接收器中收到的列表传递给 onCreate 中的 myFilteredList?

新适配器类

class NewAdapter(var itemList: ArrayList<Model>) :
    RecyclerView.Adapter<NewAdapter.ViewHolder>() {

    private lateinit var getContext: Context

    class ViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
        var x: TextView = view.txtX
        val y: TextView = view.txtY
        val z: TextView = view.txtZ
        val localPreferances = PreferencesManager()
        val context: Context = view.context
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        getContext = parent.context
        val layoutView = LayoutInflater.from(parent.context).inflate(R.layout.listview_item_list_layout, parent, false)
        return ViewHolder(layoutView)
    }

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

            var receivedList = itemList[position]

            if (receivedList?.dataA != null) {
                holder.y?.text = "${receivedList?.dataA}"
            } else holder.y?.text = ""

            if (receivedList?.dataB != null) {
                holder.x?.text = "${receivedList?.dataB}"
            } else holder.x?.text = ""

            if (receivedList?.dataC != null) {
                holder.z?.text = "${receivedList?.dataC}"
            } else holder.z?.text = ""
    }

        override fun getItemCount() = itemList.size
    }

【问题讨论】:

  • 能否请您也发布您的适配器类实现?
  • 我已经添加了我的适配器类。我需要从 Activity 的 onCreate 传递这个列表,因为如果我不这样做,我会得到布局跳过错误,并且它什么也不显示。所以想法是在活动类内的广播接收器中接收列表,而不是将其传递给同一个类中的 Oncreate,并从那里通过 if 语句控制将哪个列表传递给 NewAdapter。但我无法在 onCreate 中填写 myFIlteredList,这是我的问题。

标签: java android kotlin android-recyclerview broadcastreceiver


【解决方案1】:

您需要通知Adapter 对其数据源的更改,在您的情况下为ListmyFilteredList = Gson().fromJson(recList, token.type) 还将创建ArrayList 的新实例并将其分配给myFilteredList,但提供的初始实例与您的适配器不同

private val receiverFilteredList = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        var recList = intent.getStringExtra("filteredList")
        if (recList != null){
            var token: TypeToken<ArrayList<Model?>?> = object : TypeToken<ArrayList<Model?>?>() {}
            myFilteredList.clear() //clear existing data 
            myFilteredList.addAll(Gson().fromJson(recList, token.type)) // add new data
            adapter.notifyDataSetChanged() //reset the list
        }
    }
}

【讨论】:

  • 感谢您的努力,但 myFilteredList 仍然为空。
【解决方案2】:

我不得不改变方法,广播接收器不适合我。我通过 Intent.putExtra 从适配器发送了列表 (Gson().toJson),在活动中我像这样收到它

recList= intent.getStringExtra("filteredList")

if (recList!= null){
   var token: TypeToken<ArrayList<Model?>?> = object : TypeToken<ArrayList<Model?>?>() {}
            myFilteredList?.clear()
            myFilteredList= Gson().fromJson(recList, token.type)
}

现在一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多