ViewPager с двумя вкладками вызывает IndexOutOfBoundsException при скольжении и нажатии - PullRequest
0 голосов
/ 13 марта 2020

У меня есть две вкладки, в которые я добавляю два разных списка данных, обе вкладки разделяют одно представление переработчика, поэтому в моем адаптере 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]
    }

1 Ответ

1 голос
/ 20 апреля 2020
viewPagerAdapter.productsList = productsList
viewPagerAdapter.drinksList = drinksList
viewPagerAdapter.notifyDataSetChanged()

Если я не понял неправильно, когда вы пришли сюда, ваш viewPagerAdapter уже создан, и вы определили свои списки как ненулевые в адаптере (MutableList ).

fun getItem(position: Int):Product{
    return productList[position]
}

Например, этот блок пытается получить позицию 1 при создании адаптера и перед установкой данных. Он будет возвращать IndexOutOfBoundsException.

Может быть, вы должны попытаться переместить эти списки в конструкторе viewPagerAdapter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...