【问题标题】:How to access Dialog's view without creating additional class如何在不创建其他类的情况下访问 Dialog 的视图
【发布时间】:2019-02-27 20:20:20
【问题描述】:

有谁知道我需要为 RecyclerView 适配器中的单击侦听器使用哪个上下文(如果有的话),而无需创建新的 DialogFragment 类?我将来需要访问和使用对话框的视图。 以前使用的代码是我过去用于我的 RecyclerView 适配器的,但现在在需要使用自定义视图时它是多余的。

未解决的参考:'layoutInflater'

以前使用的代码

    holder.myButton.setOnClickListener {
        val builder = android.app.AlertDialog.Builder(holder.itemView.context)
        builder.setIconAttribute(R.attr.ivInfo)
        builder.setTitle(R.string.dialog_title)
        builder.setMessage(R.string.dialog_message)
        builder.setView(R.layout.custom_view)
        builder.setPositiveButton(android.R.string.ok){ dialog, _ -> dialog.dismiss() }

        val dialog: android.app.AlertDialog = builder.create()
        dialog.show()
    }

当前代码

class MyRVAdapter() : RecyclerView.Adapter<MyRVAdapter.ViewHolder>() {
    override fun getItemCount(): Int {
        return myList.size
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.myButton.setOnClickListener {
            customView = holder.itemView.context.this.layoutInflater.inflate(R.layout.fragment_dialog, null)

                val builder = AlertDialog.Builder(holder.itemView.context)
                 builder.setIconAttribute(R.attr.imgNight)
                 builder.setTitle(R.string.dialog_title)
                 builder.setView(customView)
                 builder.setPositiveButton(android.R.string.ok){ dialog, _ -> dialog.dismiss() }
                 builder.show()

                tabLayout = customView.findViewById(R.id.mTabLayout)
                viewPager = customView.findViewById(R.id.mViewPager)

                val adapter = TabbedDialogAdapter(childFragmentManager)
                adapter.addFragment("Tab A", TabbedDialogFragment.createInstance("Description A"))
                adapter.addFragment("Tab B", TabbedDialogFragment.createInstance("Description B"))
                adapter.addFragment("Tab C", TabbedDialogFragment.createInstance("Description C"))

                customView.mViewPager.adapter = adapter
                customView.mTabLayout.setupWithViewPager(customView.mViewPager)
            }
        }
     }

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

    class ViewHolder (itemView : View):RecyclerView.ViewHolder(itemView) {
        val myButton = itemView.findViewById<Button>(R.id.btn_A)!!
    }
}

【问题讨论】:

  • 只需将您的活动用作上下文。
  • @RaymondArteaga 你的意思是在某处使用getActivity 吗?
  • 在 onBindViewHolder() 中设置监听器不是一个好主意。您应该改为创建 ViewHolder。在 ViewHolder 或 onCreateViewHolder() 的构造函数中。在那里你会有View,你可以使用view.context
  • @underoid 查看我对当前代码的最新代码编辑
  • 为什么要在onBindViewHolder 中创建AlertDialog 或创建adapter 对象? onBindViewHolder 用作 Views 和数据的活页夹。这意味着您的对话框和适配器将根据您的列表大小创建多次

标签: android kotlin android-dialogfragment android-dialog onitemclicklistener


【解决方案1】:

要解决您的问题,您可以使用View.inflate()

改变这一行:

customView = holder.itemView.context.this.layoutInflater.inflate(R.layout.fragment_dialog, null)

对此:

customView = View.inflate(holder.itemView.context, R.layout.fragment_dialog, null)

但是您应该在创建 ViewHolder 时设置侦听器。在 ViewHolder 的构造函数中或者onCreateViewHolder().

【讨论】:

  • 哪一个更好或最推荐? ViewHolder 构造函数或onCreateViewHolder()?
  • 我已经在 viewHolder 类中创建了我的按钮,那么如何为 onCreateViewHolder() 访问它?
  • 您在onCreateViewHolder() 中获得创建的ViewHolder 对象,并且您只能访问itemView。所以构造函数更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多