【发布时间】:2021-09-13 15:57:30
【问题描述】:
我很难掌握 Kotlin。对我来说,学习曲线似乎特别难。
我正在尝试为我儿子编写一个简单的应用程序来跟踪他的家庭作业。我有一个回收者视图,其中显示了他的 25 个家庭作业。他可以按任何顺序完成它们,所以我认为回收商非常适合。在大量拔掉头发后,我设法让回收器工作。我并没有声称完全理解正在发生的事情,但它正在工作并且它很好地返回了列表。 Screenshot
现在我有了这个,以及来自任务的标题信息,我希望我的儿子能够点击任务(可能长按)并弹出任务的完整详细信息。
我知道通过使用 popupWindow,我几乎可以使用任何布局。我的布局将包含 TextViews 和 ImageViews 以及 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)
}
}
这似乎没问题,但我现在卡住了。
最初的问题是“...修改您的适配器初始化并将其传递给那里,就像选择器适配器(this,chooseList)一样粗略”。我在 MainActivity 的 onCreate 中调用来填充适配器(在我添加第二个参数之前)是:
val adapter = AllTasksAdapter(data)
allTasksRecycler.adapter = adapter
我将数据进一步定义为:
val data = ArrayList<ItemsViewModel>()
所以我正在努力解决的两件事是: (1) 我为第一个参数提供的内容 (2) 如何将回收站与打开弹窗的调用联系起来
原始问题在原始帖子的上下文中讨论了 ChooserActivity 和 MusclePopup,但我无法弄清楚我的代码中的等价物是什么。
我的代码中的回收器是 AllTasksRecycler。这是在扩展名为 card_view_design.xml 的布局,而我想用于显示详细信息的布局称为 single_task_details.xml
我想我已经很接近了,但我只需要一点帮助就可以完成这部分的工作。有人可以帮我推一下正确的方向吗?
【问题讨论】:
标签: kotlin android-recyclerview popupwindow