2012-11-04 34 views
10

W mojej działalności używam ViewPager, aby przesuwać w lewo/w prawo i wyświetlać widok miesiąca. Ja przechodząc miesiąc i rok wartości od onCreate do PagerAdapter:Kalendarz i PagerAdapter - nieograniczona liczba wyświetleń

private static int NUM_AWESOME_VIEWS = 3; 

viewPager = (ViewPager) v.findViewById(R.id.pager); 
cAdapter = new CalendarPagerAdapter(this.getActivity().getApplicationContext(), date_value, fragmentManager, month, year); 
viewPager.setAdapter(cAdapter); 
viewPager.setOffscreenPageLimit(3); 

Kalendarz zaczyna się od listopada, a następnie przewija do stycznia. Chciałbym, aby Kalendarz wyświetlał nieograniczoną liczbę wyświetleń do przodu i do tyłu.

PagerAdapter:

public CalendarPagerAdapter(Context context, int dv, FragmentManager fm, int month, int year){ 
    this.context = context; 
    this.dv = dv; 
    this.fm = fm; 
    this.month = month; 
    this.year = year; 

} 

public Object instantiateItem(View collection, int position) { 
    Log.d("Object", "Instantiated"); 
    LayoutInflater inflater = (LayoutInflater) collection.getContext() 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    View v = inflater.inflate(R.layout.simple_calendar_view, null); 

    _calendar.set(Calendar.MONTH, month); 
    _calendar.set(Calendar.YEAR, year); 

    month = _calendar.get(Calendar.MONTH) + 1; 
    year = _calendar.get(Calendar.YEAR); 

    currentMonth = (Button) v.findViewById(R.id.currentMonth); 
    currentMonth.setText(hijri.getMonthForInt(month-1).toUpperCase() + " " + year); 

    calendarView = (GridView) v.findViewById(R.id.calendar); 
    calendarWeek = (GridView) v.findViewById(R.id.calendarweek); 

    calendarWeek.setAdapter(new CalendarWeekAdapter(context, firstDay)); 
    // Initialised 
    adapter = new GridCellAdapter(calendarView, context, R.id.calendar_day_gridcell, month, year, 0, 0, 0); 
    adapter.notifyDataSetChanged(); 
    calendarView.setAdapter(adapter); 

    ((ViewPager) collection).addView(v, 0); 

    return v; 
} 

podstawie Jon Willis' code, to co mam wymyślić, ale gdy pozycja viewpager jest 0 lub 2, strona gaśnie, a następnie wyświetla następny miesiąc + 1 (czyli po przewinięciu stycznia strona migocze i wyświetla marzec). Nie przewija się płynnie. Nie wiem, jak inaczej to zrobić.

viewPager.setOnPageChangeListener(new OnPageChangeListener() { 
    @Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

    } 

    @Override 
    public void onPageScrollStateChanged(int state) { 
      if (state == ViewPager.SCROLL_STATE_IDLE) 

       Log.d("Calendar ViewPager", "Calendar ViewPager" + viewPager.getCurrentItem()); 

        if (focusedPage == 0) { 

          _calendar.add(Calendar.MONTH, -1); 
          month = _calendar.get(Calendar.MONTH); 
          year = _calendar.get(Calendar.YEAR); 

          setGridCellAdapter(context, month, year); 

        } else if (focusedPage == 2) { 

          _calendar.add(Calendar.MONTH, +1); 
          month = _calendar.get(Calendar.MONTH); 
          year = _calendar.get(Calendar.YEAR); 


          setGridCellAdapter(context, month, year); 

        } 

        viewPager.setCurrentItem(1, false); 
      } 
    } 

    @Override 
    public void onPageSelected(int position) { 
      focusedPage = position; 
    } 
}); 



public void setGridCellAdapter(Context ctx, int month, int year) 
{ 
    cAdapter = new CalendarPagerAdapter(ctx, date_value, fragmentManager, month, year); 
    Log.d("Object", "Re-instantiatted" + month + year); 
    cAdapter.notifyDataSetChanged(); 
    viewPager.setAdapter(cAdapter); 

} 
+0

Myślałem, że już to rozwiązaliśmy. Jeśli zdobędziesz swój pełny folder projektu, zrobię to za Ciebie. Już raz zapłaciłeś mi za to nagrodę. Przed użyciem mojego Dysku Google opublikowaliśmy pełne foldery projektów. Zapakowuję go, umieszczam na dysku google, oznaczam jako publiczny, a następnie umieszczam link do niego tutaj. To znaczy, jeśli nie masz nic przeciwko udostępnieniu całego twojego kodu. –

+0

Witam @JasonHessley, naprawdę doceniam, jeśli możesz mi pomóc w tej sprawie. – input

Odpowiedz

4

Osiągnąłem to, ale nie za dobrze, używając każdej strony jako 3 fragmenty. Gdy użytkownik przesunie się w prawo lub w lewo, ustawi się ponownie na środku i zaktualizuje nowe źródło danych dla każdego fragmentu.

W Main

MonthViewContentFragment[] fragList = new MonthViewContentFragment[3]; 
fragList[0] = MonthViewContentFragment.newInstance(prevMonth); 
fragList[1] = MonthViewContentFragment.newInstance(currentMonth); 
fragList[2] = MonthViewContentFragment.newInstance(nextMonth); 

ViewPager monthPage = (ViewPager) v.findViewById(R.id.monthview_content); 
MonthPageAdapter monthPageAdapter = new MonthPageAdapter(getFragmentManager(), fragList); 
monthPage.setAdapter(monthPageAdapter); 
monthPage.setOnPageChangeListener(this); 
monthPage.setCurrentItem(1, false); 

w onPageScrollStateChanged

if (state == ViewPager.SCROLL_STATE_IDLE) { 

    if (focusPage < PAGE_CENTER) { 
     currentMonth.add(Calendar.MONTH, -1); 
    } else if (focusPage > PAGE_CENTER) { 
     currentMonth.add(Calendar.MONTH, 1);  
    } 
    monthPageAdapter.setCalendar(currentMonth); 
    monthPage.setCurrentItem(1, false); 
    updateTitle(); 
} 

w onPageSelected

public void onPageSelected(int position) { 
     // TODO Auto-generated method stub 
     focusPage = position; 
} 

W MonthPageAdapter

MonthViewContentFragment[] fragList;  
    MonthViewContentFragment temp; 
    int fragNumber = 3; 

    public MonthPageAdapter(FragmentManager fm, MonthViewContentFragment[] fragList) { 
     super(fm); 
     this.fragList = fragList; 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     // TODO Auto-generated method stub 
     return POSITION_NONE; 
    } 
    @Override 
    public Fragment getItem(int position) { 
     return fragList[position];  
    } 

    @Override 
    public int getCount() { 
     return 3; 
    } 
    public void setCalendar(Calendar currentMonth) { 

     Calendar prevMonth = Calendar.getInstance(); 
     prevMonth.setTime(currentMonth.getTime()); 
     prevMonth.add(Calendar.MONTH, -1); 

     Calendar nextMonth = Calendar.getInstance(); 
     nextMonth.setTime(currentMonth.getTime()); 
     nextMonth.add(Calendar.MONTH, 1); 
      //update all 3 fragments 
     fragList[0].updateUI(prevMonth); 
     fragList[1].updateUI(currentMonth); 
     fragList[2].updateUI(nextMonth); 
    } 

W MonthViewContentFragment

@Override 
    public void updateUI(Calendar monthYear) { 

     View v = getView(); 
     if (v == null) 
      return; 
     //setNewDataSource calcurate new List<String> date 
     calendarViewAdapter.setNewDataSource(monthYear); 
     calendarViewAdapter.notifyDataSetChanged(); 
    } 

To nie jest idealny, ponieważ kiedy Swift użytkownik zbyt szybko. Zwój nie zmienia się w stan bezczynności, a następnie kończy się ViewPager.

+0

Dziękuję za odpowiedź. Czy możesz mi powiedzieć, co to jest "PAGE_CENTER" i "focusPage" i "isDragging"? – input

+0

Nie jestem pewien, dlaczego, ale otrzymuję błąd 'ArrayIndexOutOfBoundException'. – input

+0

PAGE_CENTER ma zawsze wartość 1. Strona fokus jest ustawiana na 0 lub 2 podczas przełączania, a po aktualizacji z powrotem na 1. isDragging po prostu go usuń, mój błąd. – SaintTail

4

Nie jestem pewien, czy rozumiem to (nigdy nie użył tego viewPager, zawsze stosowany inny HorizontalViewSlider zamiast), ale za onPageScrollStateChanged() Dlaczego masz szczególny przypadek dla focusedPage == 0 i focusedPage = = 2?

jeśli w styczniu i marcu nie ma nic szczególnego, może usunąć wszystko z wewnątrz na stroniePageScrollStateChanged()?

Domyślam się, że migotanie pochodzi z wywołania metody setGridCellAdapter(), ponieważ spowoduje to odświeżenie strony przed wywołaniem polecenia notifyDataSetChanged.

+0

dzięki za odpowiedź. Ustawię liczbę dla viewpager na 3 widoki naraz.Więc jeśli poruszam się tam iz powrotem, powinien on załadować następny i poprzedni miesiąc w tle. Oto, co zrozumiałem z logiki: http://stackoverflow.com/questions/7440012/infinite-viewpager – input