ViewPager - TabLayout с LiveData - PullRequest
       9

ViewPager - TabLayout с LiveData

1 голос
/ 19 апреля 2020

У меня есть список продуктов в представлении переработчика. После нажатия на элемент вы перейдете ко второму действию, чтобы показать больше информации, связанной с этим продуктом. Я пытаюсь реализовать ViewPager. следовал учебнику из CodingWithMitch , но в своем примере он имеет случайные данные и мог легко их получить.

ArrayList<Fragment> fragments = new ArrayList<>();
    Hat[] hats = Hats.getHats();
    for(Hat hat: hats){
        ViewPagerItemFragment fragment = ViewPagerItemFragment.getInstance(hat);
        fragments.add(fragment);
    }
    MyPagerAdapter pagerAdapter = new MyPagerAdapter(getSupportFragmentManager(), fragments);
    mMyViewPager.setAdapter(pagerAdapter);
    mTabLayout.setupWithViewPager(mMyViewPager, true);

К сожалению, для меня данные были получены из объекта Livedata. Как я могу l oop или перебирать жилаты, чтобы извлечь все объекты товаров, чтобы я мог установить фрагменты!

ArrayList<Fragment> fragments = new ArrayList<>();
    final MarketViewModel marketViewModel = new ViewModelProvider(this).get(MarketViewModel.class);
    MutableLiveData<List<Product>> products = marketViewModel.getProductInfo("parentID");
    //What to do here !!!
    /*for (:) {
        ProductInfoFragment fragment = ProductInfoFragment.getInstance(products);
        fragments.add(fragment);
    }*/
    ProductPagerAdapter adapter = new ProductPagerAdapter(getSupportFragmentManager(), 0, fragments);
    viewPager.setAdapter(adapter);
    tabLayout.setupWithViewPager(viewPager, true);

также, это показывает целые продукты. но как показать нажатый элемент первым. тот, который пользователь нажал. и тогда пользователь сможет менять местами список влево и вправо !?

Редактировать: я пробовал это! но теперь он показывает пустую белую страницу.

ArrayList<Fragment> fragments = new ArrayList<>();
    final MarketViewModel marketViewModel = new ViewModelProvider(this).get(MarketViewModel.class);
    marketViewModel.getProductInfo("parentID");
    marketViewModel.getProductInfo("parentID").observe(this, products -> {
        for (int i = 0; i < products.size(); i++) {
            Product product = products.get(i);
            ProductInfoFragment fragment = ProductInfoFragment.getInstance(product);
            fragments.add(fragment);
        }
    });
    ProductPagerAdapter adapter = new ProductPagerAdapter(getSupportFragmentManager(), 0, fragments);
    viewPager.setAdapter(adapter);
    tabLayout.setupWithViewPager(viewPager, true);

1 Ответ

1 голос
/ 20 апреля 2020

Пожалуйста, попробуйте собрать адаптер ViewPager после того, как LiveData отправит новые данные, так как кажется, что ViewPager инициализируется с помощью адаптера без данных, где его код запускается до того, как LiveData будет возвращено .

Итак, вы попытаетесь:

ArrayList<Fragment> fragments = new ArrayList<>();
    final MarketViewModel marketViewModel = new ViewModelProvider(this).get(MarketViewModel.class);
    marketViewModel.getProductInfo("parentID");
    marketViewModel.getProductInfo("parentID").observe(this, products -> {
        for (int i = 0; i < products.size(); i++) {
            Product product = products.get(i);
            ProductInfoFragment fragment = ProductInfoFragment.getInstance(product);
            fragments.add(fragment);
        }

        ProductPagerAdapter adapter = new ProductPagerAdapter(getSupportFragmentManager(), 0, fragments);
        viewPager.setAdapter(adapter);
        tabLayout.setupWithViewPager(viewPager, true);

    });

Редактировать: Я исправил код, но проблема не устранена. он показывает пустым, в то время как страница выглядит как застрявшая в бесконечном l oop! Это настолько ненормально для меня.

Теперь я попытаюсь просто обновить ViewPager фрагменты в LiveData Обозревателе, не перестраивая адаптер.

Итак, мы будем сохраните исходный код как есть, сделайте адаптер как поле класса и вызовите mAdapter.notifyDataSetChanged() для новых данных, возвращаемых LiveData.

ProductPagerAdapter mAdapter;

ArrayList<Fragment> fragments = new ArrayList<>();
    mAdapter = new ProductPagerAdapter(getSupportFragmentManager(), 0, fragments);
    viewPager.setAdapter(mAdapter);
    tabLayout.setupWithViewPager(viewPager, true);

    final MarketViewModel marketViewModel = new ViewModelProvider(this).get(MarketViewModel.class);
    marketViewModel.getProductInfo("parentID");
    marketViewModel.getProductInfo("parentID").observe(this, products -> {
        for (int i = 0; i < products.size(); i++) {
            Product product = products.get(i);
            ProductInfoFragment fragment = ProductInfoFragment.getInstance(product);
            fragments.add(fragment);
        }

         mAdapter.notifyDataSetChanged();  // <<<<<< here updating adapter fragemnts

    });

Кроме того, этот ответ может помочь вам правильно обновлять фрагменты адаптера.

...