4

У меня есть FragmentPagerAdapter для viewPager. Вначале в нем только один фрагмент. Я хочу динамически добавлять новый фрагмент к адаптеру, когда пользователь перебирает справа налево и динамически удаляет фрагмент, когда пользователь щелкает слева направо. Я пытался использовать эту библиотеку https://github.com/commonsguy/cwac-pager, но в этой библиотеке у нас есть возможность добавить и удалять фрагменты при нажатии кнопки. Я попытался добавить OnPageChangeListener в viewpager, но методы обратного вызова (onPageScrolled и onPageScrollStateChanged) вызываются более одного раза, что приводит к добавлению более одного фрагмента к FragmentPagerAdapter. Поэтому, пожалуйста, проследите, как это сделать.Динамическое добавление и удаление фрагментов из FragmentPagerAdapter

ответ

2

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

AFAIK, который не поддерживается никакими PagerAdadpter. Это, безусловно, не поддерживается ArrayPagerAdapter. Страница должна существовать, иначе вы не сможете ее пронести. Вы не можете провести сначала, а затем добавить страницу позже.

Кроме того, я никогда не находил случай использования для вашего предложенного шаблона, который не может быть обработан при наличии страницы быть в адаптере, но не населяющих страницу (то есть, независимо от дорогих работ является то, что вам кажется, пытаются избежать), пока не начнется салфетка.

+0

: я пытаюсь внедрить календарь поэтому, когда пользователь пойло справа налево, он идет на следующей неделе. но есть кнопка на верхней панели просмотра пейджера, которая позволяет пользователю переключать месяцы. Предположим, что этот сценарий, предположим, что пользователь сначала использует месячный коммутатор, чтобы перейти к следующему месяцу (в месяце switch butonclick я пишу viewpager.setCurrentItem (curentposition + 1)), а затем решает перевести просмотрщик на предыдущую неделю. пользователь не сможет вернуться к дате, когда он начал, потому что в задней части есть только один фрейм. Мне нужна: он вернулся, туда, где он начал. – dora

+0

@dora: «Я пытаюсь реализовать календарь, поэтому всякий раз, когда пользователь делает выборку справа налево он отправляется на следующую неделю »-« ViewPager »не подходит для этой роли, поскольку в будущем существует бесконечное количество недель и целых недель в прошлом. – CommonsWare

+0

Мне не нужно переходить на past.all Мне нужно иметь возможность перемещаться в текущее время и в будущем.so, пожалуйста, помогите мне, если есть способ для него – dora

9

@ dora: Я думаю, что в вашем случае FragmentStatePagerAdapter поможет вам. Я упомянул о его использовании ниже в соответствии с моим пониманием. Я надеюсь, что это поможет вам принять решение.

Есть два способа реализации ViewPager: • FragmentStatePagerAdapter • FragmentPagerAdapter

FragmentStatePagerAdapter класс потребляет меньше памяти, потому что она разрушает фрагменты, как только они не видны пользователю, сохраняя только сохраненное состояние что фрагмент

FragmentPagerAdapter:, когда количество фрагментов меньше. Но использование AndroidFragmentPagerAdapter для большого количества фрагментов приведет к прерывистому и отстающему UX.

Кол-во страниц придерживается viewPager? Количество элементов, которые будет удерживать любой ViewPager, задается методом setOffscreenPageLimit(). Значение по умолчанию для ограничения за пределами экрана - 3. Это означает, что ViewPager будет отслеживать текущую видимую страницу, одну влево и одну вправо. Количество отслеживаемых страниц всегда сосредоточено вокруг просматриваемой в данный момент страницы.

Пожалуйста, следуйте по этой ссылке код: http://www.truiton.com/2013/05/android-fragmentpageradapter-example/

4

Я знаю этот пост старый, но я изо всех сил, чтобы понять это, так что я буду отвечать на него в любом случае.

Вы хотите использовать FragmentStatePagerAdapter и переопределить getItemPosition(). Создайте список материалов, которые вы хотите передать фрагменту, позвоните по номеру notifyDataSetChanged(), и все готово!

Вот адаптер:

public class SectionsPagerAdapter extends FragmentStatePagerAdapter { 

     List<String> mKeyList = new ArrayList<>(); 

     public SectionsPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public int getItemPosition(Object object) { 
      return POSITION_NONE; 
     } 

     @Override 
     public Fragment getItem(int position) { 
      // getItem is called to instantiate the fragment for the given page. 
      // Return a PlaceholderFragment (defined as a static inner class below). 
      return PlaceholderFragment.newInstance(mKeyList.get(position)); 
     } 

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

     @Override 
     public CharSequence getPageTitle(int position) { 
      return "SCOUT " + (getCount() - position); 
     } 

     public void add(int position, String key) { 
      mKeyList.add(position, key); 
      notifyDataSetChanged(); 
     } 
    } 

А вот фрагмент:

public static class PlaceholderFragment extends Fragment { 

     private static final String ARG_SCOUT_KEY = "scout_key"; 

     public static PlaceholderFragment newInstance(String key) { 

      PlaceholderFragment fragment = new PlaceholderFragment(); 
      Bundle args = new Bundle(); 
      args.putString(ARG_SCOUT_KEY, key); 
      fragment.setArguments(args); 
      return fragment; 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      View rootView = inflater.inflate(R.layout.current_scout_fragment, container, false); 

      //getArguments().getString(ARG_SCOUT_KEY)); 

      return rootView; 
     } 
    } 
+0

О, боже мой. Спасибо чувак. Вы его сохранили. – sandeepmaaram

+0

О, Боже .. Спасибо, человек нашел это решение после 2 дней. работающ awesome. Большое спасибо. Достигнуто путем расширения FragmentStatePagerAdapter вместо FragmentPagerAdapter – sandeepmaaram

+0

Добавить сейчас легко, когда это случай удаления? –

Смежные вопросы