IllegalStateException:使用 GridView 和 ViewPager 时,必须首先在孩子的父级上调用 removeView()



我正在使用ViewPagerGridViewdatabinding

代码如下所示:

private fun initGridView(){
//page count
val totalPageSize = ceil(viewModel.rechargePaymentList.value!!.size.toFloat() / 6).toInt()
val viewPagerList = ArrayList<GridView>()
val layoutInflater = LayoutInflater.from(context)
//GridView
for (page in 0 until totalPageSize){
layoutInflater.inflate(R.layout.layout_gridview,binding.viewPager,false).apply {
val gridView = findViewById<GridView>(R.id.gridView)
gridView.adapter = GridViewAdapter(viewModel,context!!,page)
viewPagerList.add(gridView)
}
}
binding.viewPager.adapter = RechargeWayViewPagerAdapter(viewPagerList)
}

适配器如下所示

class RechargeWayViewPagerAdapter(private val viewList:ArrayList<GridView>): PagerAdapter() {

override fun instantiateItem(container: ViewGroup, position: Int): GridView {
container.addView(viewList[position])
return viewList[position]
}
override fun isViewFromObject(view: View, any: Any): Boolean {
return view == any as GridView
}
override fun getCount(): Int {
return viewList.size
}
override fun destroyItem(container: ViewGroup, position: Int, any: Any) {
container.removeView(viewList[position])
}
}

但它显示

IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first

我在override fun instantiateItem中尝试过container.removeView(viewList[position]).

但它似乎不起作用。

我错过了什么吗? 提前谢谢。

从问题来看,您的孩子视图已经有父母,因此请执行以下操作。

假设container.addView(viewList[position])行是罪魁祸首,那么儿童视图将被View childView = viewList[position]

if (childView != null) {
ViewGroup parent = (ViewGroup) childView.getParent();
if (parent != null) {
parent.removeView(childView);
}
}

相关内容

最新更新