Android 自定义视图在AlertDialog中显示为空

Android 自定义视图在AlertDialog中显示为空,android,kotlin,android-adapter,android-dialogfragment,android-dialog,Android,Kotlin,Android Adapter,Android Dialogfragment,Android Dialog,为什么每次我尝试将自定义视图用于我的RecyclerView适配器时,它都不会出现在我的AlertDialog中?我创建了必要的适配器和类,但由于某些原因,我没有看到任何预期的自定义布局 预期结果 当前结果 适配器 class MyRVAdapter(private val myList: ArrayList<Facility>) : RecyclerView.Adapter<RVAdapterFacilities.ViewHolder>() { overri

为什么每次我尝试将自定义视图用于我的
RecyclerView
适配器时,它都不会出现在我的
AlertDialog
中?我创建了必要的适配器和类,但由于某些原因,我没有看到任何预期的自定义布局

预期结果

当前结果

适配器

class MyRVAdapter(private val myList: ArrayList<Facility>) : RecyclerView.Adapter<RVAdapterFacilities.ViewHolder>() {
    override fun getItemCount(): Int {
        return facilitiesList.size
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        // Hide LinearLayout containing TextViews on fragment load
        holder.mLLTextViews.visibility = View.GONE

        val item = facilitiesList[position]

        holder.myButton.setOnClickListener {
            // Initialize a new instance of AlertDialog
            val builder = android.app.AlertDialog.Builder(holder.itemView.context)

            // Set the alert dialog title
            builder.setTitle("Dialog title")

            // Set the alert dialog icon
            builder.setIcon(R.drawable.ic_info_black_24dp)

            // Set the alert dialog view
            builder.setView(R.layout.fragment_dialog)

            // Find TabLayout and ViewPager views
            val tabLayout: TabLayout = holder.itemView.findViewById(R.id.m_dialog_tabs) as TabLayout
            val viewPager: ViewPager = holder.itemView.findViewById(R.id.m_dialog_viewPager) as ViewPager

            // Set classes per tab, set tab names
            val adapter = CustomAdapter(getChildFragmentManager())
            adapter.addFragment("Boy",CustomFragment.createInstance("John"));
            adapter.addFragment("Girl",CustomFragment.createInstance("Stacy"));
            adapter.addFragment("Robot", CustomFragment.createInstance("Aeon"));
            viewPager.adapter = adapter
            tabLayout.setupWithViewPager(viewPager)

            // Set TabLayout text colour
            // Set TabLayout indicator colour
            tabLayout.setTabTextColors(holder.itemView.resources.getColor(R.color.piccadilly, null), holder.itemView.resources.getColor(R.color.grey, null))
            tabLayout.setSelectedTabIndicatorColor(holder.itemView.resources.getColor(R.color.grey, null))


            // Display a positive button on alert dialog
            builder.setPositiveButton(R.string.ok){ dialog, _ -> dialog.dismiss()}

            // Finally, make the alert dialog using 'builder'
            val dialog: android.app.AlertDialog = builder.create()

            // Display the alert dialog on app interface
            dialog.show()
        }
     }

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

    // button view holder
    class ViewHolder (itemView : View):RecyclerView.ViewHolder(itemView) {
        val myBtn = itemView.findViewById<Button>(R.id.my_btn)!!
    }
}
自定义适配器类

class CustomFragment : androidx.fragment.app.Fragment() {
    private var mText = ""

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val v = inflater.inflate(R.layout.fragment_sample, container, false)
        (v.findViewById(R.id.textView_sample) as TextView).text = mText
        return v
    }

    companion object {
        fun createInstance(txt: String): CustomFragment {
            val fragment = CustomFragment()
            fragment.mText = txt
            return fragment
        }
    }
}
class CustomAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm) {
    private var mFragmentCollection: MutableList<Fragment> = ArrayList()
    private var mTitleCollection: MutableList<String> = ArrayList()
    fun addFragment(title: String, fragment: Fragment) {
        mTitleCollection.add(title)
        mFragmentCollection.add(fragment)
    }

    override fun getPageTitle(position: Int): CharSequence? {
        return mTitleCollection[position]
    }

    override fun getItem(position: Int): Fragment {
        return mFragmentCollection[position]
    }

    override fun getCount(): Int {
        return mFragmentCollection.size
    }
}
class CustomAdapter(fm:FragmentManager):FragmentPagerAdapter(fm){
私有变量MFFragmentCollection:MutableList=ArrayList()
私有变量mTitleCollection:MutableList=ArrayList()
乐趣添加片段(标题:字符串,片段:片段){
mTitleCollection.add(标题)
添加(片段)
}
覆盖有趣的getPageTitle(位置:Int):字符序列{
返回mTitleCollection[位置]
}
覆盖趣味getItem(位置:Int):片段{
返回MFFragmentCollection[位置]
}
重写fun getCount():Int{
返回MFFragmentCollection.size
}
}

我怀疑这是基于使视图膨胀的上下文。试着稍微修改一下。将您的活动传递到recyclerview,并在其中保存一个实例。这完全是为了测试目的

像这样:

class MyRVAdapter(private val myList: ArrayList<Facility>, val myActivity: Activity) : RecyclerView.Adapter<RVAdapterFacilities.ViewHolder>() {
试着这样做

val builder = android.app.AlertDialog.Builder(myActivity)
val view = myActivity.layoutInflater.inflate(R.layout.dialog_layout, null)
如果这对您有效,那么您的膨胀过程需要活动上下文而不是适配器上下文

然后由您决定是否要在适配器中保留活动上下文,或者是否可以在适配器外部处理对话框

我个人的偏好是回调以处理传递项目和/或索引的单击事件,并允许所属活动进行任何膨胀。这将是我的建议,但出于测试目的,您可以在上面做并自己打电话


愉快的编码。

我怀疑这是基于上下文膨胀视图。试着稍微修改一下。将您的活动传递到recyclerview,并在其中保存一个实例。这完全是为了测试目的

像这样:

class MyRVAdapter(private val myList: ArrayList<Facility>, val myActivity: Activity) : RecyclerView.Adapter<RVAdapterFacilities.ViewHolder>() {
试着这样做

val builder = android.app.AlertDialog.Builder(myActivity)
val view = myActivity.layoutInflater.inflate(R.layout.dialog_layout, null)
如果这对您有效,那么您的膨胀过程需要活动上下文而不是适配器上下文

然后由您决定是否要在适配器中保留活动上下文,或者是否可以在适配器外部处理对话框

我个人的偏好是回调以处理传递项目和/或索引的单击事件,并允许所属活动进行任何膨胀。这将是我的建议,但出于测试目的,您可以在上面做并自己打电话


快乐的编码。

你从哪里得到的
myActivity
?我的第一条评论:)。我说“稍微修改一下”将您的活动传递到“回收者”视图中。这里我将更新以帮助您,我假设您创建了recycler视图也请不要将其命名为myActivity lol,这是为了举例说明RecyclerView是由alerdy创建的+我使用的是
片段
(不是
活动
)要显示我的
RecyclerView
。我应该用什么替换
mySavedActivity
?您从哪里获得
myActivity
?我的第一条评论:)。我说“稍微修改一下”将您的活动传递到“回收者”视图中。这里我将更新以帮助您,我假设您创建了recycler视图也请不要将其命名为myActivity lol,这是例如,RecyclerView是由alerdy创建的+我正在使用
片段
(不是
活动
)来显示我的
RecyclerView
。我应该用什么来替换
我的AvedActivity