2016-01-26 2 views
0

Мне поручено создать ползунок даты, в котором изначально отображаются даты текущей недели, начиная с воскресенья и до субботы. Когда пользователь щелкает в любом случае, он должен «привязываться» к следующей/предыдущей неделе.FragmentPagerAdapter - Вставка фрагмента в начале не обновляется

target design

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

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

Пока я использую Xamarin, мне все равно, есть ли решение в Xamarin или нет. Если кто-то работает на Java, я могу просто конвертировать код. Поэтому, пожалуйста, не ограничивайте ответы только на Xamarin Android.

Для дизайна, я использую ViewPager, так как он обрабатывает «привязку» автоматически. Первоначально я пытался использовать RecyclerView, но не мог заставить привязку работать надежно. Поэтому я решил использовать ViewPager и FragmentPagerAdapter.

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

Первоначально я создаю WeekFragment с за 3 недели: текущую неделю, одну предыдущую неделю и одну будущую неделю. Они хранятся в общем списке в FragmentPagerAdapter.

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

public void OnPageSelected(int position) 
    { 
     var isAtBeginning = position == 0; 
     if (isAtBeginning) 
     { 
      // we are at the beginning of the date list. Append another week to beginning 
      _pagerAdapter.AddWeekToBeginning(); 
     } 
    } 

Метод AddWeekToBeginning есть ..

public void AddWeekToBeginning() 
    { 
     _earliestDate = _earliestDate.AddDays(-DaysInWeek); 
     var frag = new WeekFragment(_earliestDate); 
     frag.SelectedDate = this.SelectedDate; 
     frag.DateSelected += DaySelected; 
     _fragments.Insert(0, frag); 

     NotifyDataSetChanged(); 
    } 

Я также переопределены два основных FragmentPagerAdapter методы/свойства: GetItems и Count

public override int Count 
    { 
     get 
     { 
      Console.WriteLine($"Fragment Count: {_fragments.Count}"); 
      return _fragments.Count; 
     } 
    } 

    public override V4.Fragment GetItem(int position) 
    { 
     return _fragments[position]; 
    } 

Опять же, список подложка не обновляется. После первого прокрутки влево-вправо (переход в прошлое) консоль показывает, что в списке есть 4 фрагмента. Однако ViewPager не позволяет мне прокручивать влево-вправо, чтобы увидеть новый первый фрагмент.

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

+1

Пожалуйста, попробуйте перекрывая * getItemPosition *. Реализация по умолчанию всегда возвращает UNCHANGED, поэтому адаптер никогда не замечает перемещение страницы. –

ответ

0

Используйте FragmentStatePagerAdapter

Обновить Ваше Фрагментные данные:

public class YourFragment extends Fragment { 
    @Override 
    public void setUserVisibleHint(boolean isVisibleToUser) { 
     super.setUserVisibleHint(isVisibleToUser); 
     if (isVisibleToUser) { 
      //Update Here 

     } else { 
     } 
    } 
} 
Смежные вопросы