Как я могу создать модель представления для каждого фрагмента внутри страницы просмотра

В основном я хочу создать модель представления для каждого фрагмента в пейджере представлений. каждая страница в пейджере просмотра имеет разные данные для выборки из сети.

Просмотр пейджера -> просмотр адаптера пейджера -> фрагмент с моделью просмотра

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

productsViewModel = ViewModelProviders.of (это, viewModelFactory) .get (categoryName !!, ProductsViewModel :: class.java)

наличие имени категории не работает, потому что по-прежнему используется та же модель представления.

Можете ли вы дать нам представление о том, что может быть лучшим в данной ситуации?


person chethan    schedule 28.07.2019    source источник
comment
Вам не нужно ничего делать. Обычно другой экземпляр ViewModel создается, когда вы передаете другой экземпляр fragment в ViewModelProviders.of(fragment).   -  person Sanlok Lee    schedule 29.07.2019


Ответы (2)


Вы можете добиться этого, используя простую логику. динамически подготовьте свой ViewPager с данными, необходимыми для настройки. Здесь я подготовил пейджер просмотра с одним и тем же фрагментом несколько раз, так как вы можете настроить свой ViewPager с другим фрагментом. :)

 private void setupViewPager(ViewPager viewPager, Data yourData) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());

        for (int i = 0; i < tabTitleList.size(); i++) {
            adapter.addFragment(new YourFragment(), tabTitleList.get(i),yourData.getData().get(i));
        }

        viewPager.setAdapter(adapter);
    }

public class ViewPagerAdapter extends FragmentPagerAdapter {

        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFragment(Fragment fragment, String title, Data yourData) {
            Bundle bundle = new Bundle();
            bundle.putSerializable("key",yourData);
            fragment.setArguments(bundle);
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }

        @Override
        public int getItemPosition(Object object) {
            return POSITION_NONE;
        }
    }
person iamnaran    schedule 29.07.2019
comment
Это не лучшая идея по нескольким причинам: у вас есть все данные страницы заранее, прежде чем настраивать адаптер. в этом случае это просто не обеспечит вам лучшего взаимодействия с пользователем. view не будет готов, пока все эти сетевые вызовы не получат данные. это заставит пользователя ждать дольше. это не нормально, если в окне просмотра от 6 до 7 страниц. Более того, вы будете держать тяжелый предмет. каждая страница на странице просмотра должна иметь свою собственную модель представления для заполнения данных. но здесь модель представления использовалась на всех страницах и отражала одни и те же данные, и это то, что мне нужно преодолеть. - person chethan; 29.07.2019

Санлок Ли прав :

Вам не нужно ничего делать. Обычно другой экземпляр ViewModel создается, когда вы передаете другой экземпляр fragment в ViewModelProviders.of(fragment)

Что я делаю неправильно, я храню все данные страницы (сетевые данные) в таблице и не запрашиваю их по категории страниц. следовательно, все данные воспроизводились одинаково на всей странице.

person chethan    schedule 30.07.2019