为什么每当我尝试将它用于我的AlertDialog
适配器时,我的自定义视图都不会出现在我的RecyclerView
中?我创建了必要的适配器和类,但由于某种原因,我没有按预期看到任何自定义布局。
预期结果
目前的结果
适配器
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)!!
}
}
CustomFragment类
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
}
}
}
CustomAdapter类
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
}
}
我怀疑它是基于膨胀视图的背景。尝试稍微修改它。将您的活动传递到recyclerview并在那里保存它的实例。这仅用于测试目的。
像这样:
class MyRVAdapter(private val myList: ArrayList<Facility>, val myActivity: Activity) : RecyclerView.Adapter<RVAdapterFacilities.ViewHolder>() {
我猜你的问题在这里:
val builder = android.app.AlertDialog.Builder(holder.itemView.context)
试试这个。
val builder = android.app.AlertDialog.Builder(myActivity)
val view = myActivity.layoutInflater.inflate(R.layout.dialog_layout, null)
如果这对你有用,那么你的通胀过程需要Activity上下文而不是你的适配器上下文。
然后,如果您想在适配器中保留活动上下文,或者您可以在适配器外部处理对话框膨胀,则由您决定。
我个人的偏好是进行回调以处理传递项目和/或索引的点击事件,并允许拥有活动进行任何膨胀。这将是我的建议,但出于测试目的,你可以在上面做,并自己打电话。
快乐的编码。