Android 带有两个选项卡的ViewPager在滑动和单击时会导致IndexOutOfBoundsException
我有两个选项卡,其中添加了两个不同的数据列表,两个选项卡共享一个recyclerview,因此在我的viewpager适配器上,我只创建一个新实例来填充数据 从视图 如果您来这里时我没有理解错,那么您的viewPagerAdapter已经创建,并且您在adapter中将列表定义为非空(MutableListAndroid 带有两个选项卡的ViewPager在滑动和单击时会导致IndexOutOfBoundsException,android,kotlin,android-recyclerview,android-viewpager,android-architecture-navigation,Android,Kotlin,Android Recyclerview,Android Viewpager,Android Architecture Navigation,我有两个选项卡,其中添加了两个不同的数据列表,两个选项卡共享一个recyclerview,因此在我的viewpager适配器上,我只创建一个新实例来填充数据 从视图 如果您来这里时我没有理解错,那么您的viewPagerAdapter已经创建,并且您在adapter中将列表定义为非空(MutableList) 例如,在创建适配器时和设置数据之前,此块尝试获取位置1。它将返回IndexOutOfBoundsException 可能您必须尝试在viewPagerAdapter的构造函数中移动此列表。
可能您必须尝试在viewPagerAdapter的构造函数中移动此列表。请提供完整的堆栈跟踪。@MikeM。Stacktrace:进一步考虑,实际上,我们可能不需要
StoreAdapter
,因此如果您的问题空间不足,请暂时发布FragmentProducts
。
val allProducts = completeProductList
val productsList = mutableListOf<Products>()
val drinksList = mutableListOf<Products>()
for (product in allProducts) {
if (product.isDrink) {
drinksList.add(product)
} else {
productsList.add(product)
}
}
viewPagerAdapter.productsList = productsList
viewPagerAdapter.drinksList = drinksList
viewPagerAdapter.notifyDataSetChanged()
class PagerAdapter(fragmentActivity: FragmentActivity) :
FragmentStateAdapter(fragmentActivity) {
var productsList: MutableList<Product> = arrayListOf()
var drinksList: MutableList<Product> = arrayListOf()
override fun getItemCount(): Int {
return 2
}
override fun createFragment(position: Int): Fragment {
return when(position){
0 -> {
FragmentProducts.newInstance(productsList)
}
else -> {
FragmentProducts.newInstance(drinksList)
}
}
}
}
companion object {
fun newInstance(product: MutableList<Product>) = FragmentProducts().apply {
arguments = Bundle().apply {
putParcelableArrayList(ARG_PROD,ArrayList<Parcelable>(product))
}
}
}
// I get the product list from the adapter, either drinks or normal products
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
productsList = it.getParcelableArrayList<Product>(ARG_PROD)
}
}
// Then I just set it up to the shared recyclerview
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
adapter.productsList = productsList!!
adapter.notifyDataSetChanged()
}
fun getItem(position: Int):Product{
return productList[position]
}
viewPagerAdapter.productsList = productsList
viewPagerAdapter.drinksList = drinksList
viewPagerAdapter.notifyDataSetChanged()
fun getItem(position: Int):Product{
return productList[position]
}