У меня есть две вкладки, в которые я добавляю два разных списка данных, обе вкладки разделяют одно представление переработчика, поэтому в моем адаптере ViewPager я просто создаю новый экземпляр для заполнения данными
Из представления
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)
}
}
}
}
Тогда в моем FragmentProducts
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()
}
Итак, список отображается правильно, допустим, у меня есть два вкладки, первая вкладка имеет 2 элемента, а вторая вкладка имеет 1 элемент, поэтому, если я нажимаю элемент 1 на вкладке 1, я получаю его идентификатор и получаю нужный продукт, а затем, если я нажимаю элемент 2 на вкладке 1, он также работает, когда я проведите пальцем до вкладки 2 и нажмите элемент 1, он снова будет правильно отображать элемент, но, если я go вернусь к вкладке 1 и нажмите элемент 2, будет выброшено IndexOutOfBoundsException
, похоже, что при перелистывании назад требуется последний просмотр переработчика набор данных
Я не знаю, как это исправить, чтобы предотвратить создание другого фрагмента для вкладки 2, поскольку они показывают те же данные
Мне нужно знать, что происходит, кажется, что последний FragmentProducts .newInstance (напитки Список) заменяет весь обзор переработчика на вкладке 1
StackTrace
java .lang.IndexOutOfBoundsException: Index: 1, Size: 1 at java .util.ArrayList. получить (ArrayList. java: 411) на com.StoreAdapter.getItem (StoreAdapter.kt: 45) на com.FragmentProducts.onCartClick (FragmentProducts.kt: 65) на com.StoreAdapter $ StoreViewHolder $ bind $ 1.onClick (StoreAdapter. kt: 59)
Ошибка StoreAdapter в этой строке
fun getItem(position: Int):Product{
return productList[position]
}