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,但我无法弄清楚我的代码中的等价物是什么。
我代码中的回收器是AllTasksRecycler。这正在膨胀一个名为 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.
}
}
我很难掌握 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,但我无法弄清楚我的代码中的等价物是什么。
我代码中的回收器是AllTasksRecycler。这正在膨胀一个名为 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.
}
}