Kotlin Recycler View 触发弹出窗口 window(或者在我的情况下不是)

Kotlin Recycler View triggering a popup window (or not in my case)

我很难掌握 Kotlin。对我来说学习曲线似乎特别难。

我正在尝试为我儿子编写一个简单的应用程序来跟踪他的家庭作业。我有一个回收站视图,显示他的 25 项家庭作业任务。他可以按任何顺序完成它们,所以我认为回收商非常适合这个。在拔掉很多头发后,我设法让回收机开始工作。我并不声称完全理解正在发生的事情,但它正在工作并且它很好地返回了列表。 Screenshot

现在我有了这个,有了任务的标题信息,我希望我的儿子能够点击任务(也许长按)并弹出任务的完整细节。

我知道通过使用 popupWindow 我几乎可以使用任何布局。我的布局将包含 TextViews,可能还有 ImageViews 和 Select 按钮(即 select 此任务)和 Complete(标记他已完成)。

这个问题我看了,好像和我想做的很接近。 Popup inside a recycler View。我能够在原来的适配器中进行更改

class AllTasksAdapter(
  private val chooserAdapterCallback: ChooserAdapterCallback,
  private val mList:List<ItemsViewModel>) 
  :RecyclerView.Adapter<AllTasksAdapter.ViewHolder>() {

  class ViewHolder(ItemView: View) : RecyclerView.ViewHolder(ItemView) {
    val subjectImage: ImageView = itemView.findViewById(R.id.subjectImage)
    val txtTaskName: TextView = itemView.findViewById(R.id.txtTaskName)
    val txtTaskRequirements: TextView = itemView.findViewById(R.id.txtTaskRequirements)
  }

  override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
      // inflates the card_view_design view that is used to hold list item
      val view = LayoutInflater.from(parent.context)
          .inflate(R.layout.card_view_design, parent, false)

      return ViewHolder(view)
  }

  @RequiresApi(Build.VERSION_CODES.O)
  override fun onBindViewHolder(holder: ViewHolder, position: Int) {

      val t = mList[position]

      // sets the views from our itemHolder class
      if(t.subjectID == 1) //English/Topic
      { holder.subjectImage.setImageResource(R.drawable.icons8_knowledge_sharing_80)  }
      else if(t.subjectID == 2) //Maths
      { holder.subjectImage.setImageResource(R.drawable.icons8_maths_64)  }
      else if(t.subjectID == 3) //Science
      { holder.subjectImage.setImageResource(R.drawable.icons8_test_tube_80)  }
      else if(t.subjectID == 4) //Reading
      { holder.subjectImage.setImageResource(R.drawable.icons8_reading_80)  }
      else if(t.subjectID == 5) //Spelling
      { holder.subjectImage.setImageResource(R.drawable.icons8_broken_pencil_80)  }

      holder.txtTaskName.text = t.name
      holder.txtTaskRequirements.text = t.requirements
      holder.subjectImage.tooltipText = t.subject

    holder.itemView.setOnClickListener {
        chooserAdapterCallback.onChooseAdapterClick(t)
    }
}

//return the number of the items in the list
override fun getItemCount(): Int {
  return mList.size
}

interface ChooserAdapterCallback{
  fun onChooseAdapterClick(t: ItemsViewModel)
}

}

这似乎没问题,但我现在卡住了。

最初的问题是“...修改您的适配器初始化并将其大致传递到那里作为 ChooserAdapter(this, chooseList)”。我在 MainActivity 的 onCreate 中填充适配器(在我添加第二个参数之前)的调用是:

val adapter = AllTasksAdapter(data)
allTasksRecycler.adapter = adapter

我将数据进一步定义为:

val data = ArrayList<ItemsViewModel>()

所以我正在努力解决的两件事是: (1) 第一个参数我提供的是什么 (2) 我如何link 回收站调用打开弹窗

原始问题在原始 post 的上下文中讨论了 ChooserActivity 和 MusclePopup,但我无法弄清楚我的代码中的等价物是什么。

我代码中的回收器是AllTask​​sRecycler。这正在膨胀一个名为 card_view_design.xml 的布局,我想用于显示详细信息的布局称为 single_task_details.xml

我想我已经很接近了,但我只需要一点帮助来完成这部分。有人能给我一个正确的方向吗?

在您所关注的示例中,适配器 + ChooserAdapterCallback 由 ChooserActivity class 实现。将其作为构造函数参数传递将不起作用。

interface ChooserAdapterCallback{
  fun onChooseAdapterClick(t: ItemsViewModel)
}

如果您想重用您的方法,请将上下文传递给您的适配器,如下所示。否则采用与您提供的其他问题完全相同的方法。

class AllTasksAdapter(
  private val context: Activity,
  private val mList:List<ItemsViewModel>) 
  :RecyclerView.Adapter<AllTasksAdapter.ViewHolder>() {

现在,在所需的 activity 中实例化您的适配器,其中“this”指的是 activity/context。

val adapter = AllTasksAdapter(this, data)

在 onBindViewHolder 方法中,使用,其中 CustomDialog 只是 Dialog class:

holder.itemView.setOnClickListener {
            CustomDialog(this, character).show()
        }

例如,

    class CustomDialog(
    private val adapter: AllTasksAdapter,
    private val taskItem: Task // or however your model is called
): Dialog(adapter.context) {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        requestWindowFeature(Window.FEATURE_NO_TITLE)
        setContentView(R.layout.fragment_pop_up)
        setupComponents()
    }

    private fun setupComponents() {
        findViewById<TextView>(R.id.input_chooser).text = taskItem.name // add here the attributes you want to show.
    }
}