从Activity / RecyclerView.ViewHolder返回片段并传递数据

问题描述

我有一个应用程序,我从一个片段中打开一个活动,从RecyclerView中选择一个项目,然后用他们选择的项目中的数据填充该原始片段。它第一次工作,但是数据似乎并没有被带回到片段,然后,如果我第二次尝试,它说“找不到ID为0x7f0a001a的视图(com.tipsy.cardgenie:id / ScrollView01)对于片段AddCardFragment {dc1763f}”。我想我要么没有正确返回创建活动的片段,要么以错误的方式使用了supportfragmentmanager。

class QAViewHolder(view: View) : RecyclerView.ViewHolder(view) {

itemView.setonClickListener { v: View ->
 val addCard = AddCardFragment()
                    val args = Bundle()
                    val activity = v.context as AppCompatActivity
                    args.putString("sport",cards.sport).toString()

                    activity.supportFragmentManager.beginTransaction()
                        .replace(R.id.content,addCard)
                        .addToBackStack(null)
                        .commit()
}
}

在我拥有的片段onCreate中,它看不到我在活动中设置的数据:

 val bundle = this.arguments
            if (bundle != null) {
                sport = bundle.getString("sport").toString()
            }

内容视图也位于我要返回的片段的布局中。

<FrameLayout
        android:id="@+id/content"
        android:layout_height="match_parent"
        android:layout_width="match_parent">
</FrameLayout>

在此先感谢您的帮助或建议!

解决方法

我建议如果不需要打开新活动,则可以在片段中包含列表或recyclerview,以便可以在片段中获取更新的数据并执行所需的操作。 但是,如果您想将特定活动中的数据取回片段,则可以使用startActivityForResult(yourIntent,requestCode)这种方法从片段中打开该活动,然后使用recyclerviewinterface中选择一项,然后可以取回数据导入活动并使用此代码片段发送回去

val myIntent = Intent()
    myIntent.putExtra("data","your data")
    setResult(RESULT_OK,myIntent)
    finish()

现在,您可以在片段中声明以下方法,并在其中获取数据

 override fun onActivityResult(requestCode: Int,resultCode: Int,data: Intent?) {
    super.onActivityResult(requestCode,resultCode,data)
    // you can get your whatever data in @data object
}

,然后根据需要更新代码...而无需替换其他活动中的片段。

,

建议处理片段中的单击事件并使用回调方法。您可以像这样在适配器的构造函数中添加clickListener函数

Adapter.kt

Class Adapter(cards: List<Card>,val clickListener: (Card) -> Unit): RecyclerView.Adapter<MyAdapter.Holder>() {
}

在onBindViewHolder方法中,设置clickListener

override fun onBindViewHolder(holder: Holder?,position: Int) {
    var card : Card = cards[position]

    // Calling the clickListener sent by the constructor
    holder?.itemView?.setOnClickListener { clickListener(card) }
}

然后在您的活动中,在初始化适配器时进行此调用

Activity.kt

val adapter = Adapter(cards) {
  val addCard = AddCardFragment()
  val args = Bundle()
  args.putString("sport",cards.sport).toString()

  supportFragmentManager.beginTransaction()
      .replace(R.id.content,addCard)
      .addToBackStack(null)
      .commit()
}