2012-11-04 9 views
10

In meiner Aktivität wische ich mit ViewPager nach links/rechts und zeige die Monatsansicht entsprechend an. Ich bin vorbei an den Monat und das Jahr Werte von onCreate zum PagerAdapter:Kalender und PagerAdapter - unbegrenzte Ansichten

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); 

Der Kalender von November beginnt und rollt dann bis Januar. Ich möchte, dass der Kalender unbegrenzte Ansichten vorwärts und rückwärts anzeigt.

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; 
} 

Basierend auf Jon Willis' code, das ist, was ich mit oben kommen, aber wenn die Position des viewpager 0 oder 2 ist, die Seite wird leer und zeigt dann im nächsten Monat + 1 (das heißt, nachdem ich im Januar geblättert habe, flackert die Seite und zeigt March an). Es scrollt nicht reibungslos. Ich bin mir nicht sicher, wie ich das sonst tun soll.

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

Ich dachte, wir haben das schon gelöst. Wenn du mir deinen kompletten Projektordner besorgen kannst, werde ich das für dich arbeiten lassen. Du hast mir dafür schon einmal eine Prämie gezahlt. Ich habe komplette Projektordner veröffentlicht, bevor ich Google Drive verwende. Ich zip es, laden Sie es auf Google Drive, markieren Sie es als öffentlich, dann veröffentlichen Sie einen Link hier. Das ist, wenn es Ihnen nichts ausmacht, all Ihren Code verfügbar zu machen. –

+0

Hallo @JasonHessley, wirklich zu schätzen, wenn Sie mir auf diesem einen helfen könnten. – input

Antwort

4

Ich habe erreicht, dies aber nicht perfekt zu implementieren, indem Sie jede Seite als 3 Fragmente verwenden. Wenn Benutzer schnell nach rechts oder links bewegt wird, wird auf die Mitte zurückgesetzt und die neue Datenquelle für jedes Fragment aktualisiert.

In Haupt

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); 

in 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(); 
} 

in onPageSelected

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

In 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); 
    } 

In 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(); 
    } 

Dies ist nicht perfekt, weil, wenn der Benutzer swift zu schnell. Die Bildlaufleiste wechselt nicht in den Idle-Modus und erreicht dann ViewPager ihr Ende.

+0

Danke für Ihre Antwort. Kannst du mir bitte sagen was ist 'PAGE_CENTER' und' FocusPage' und 'isDragging'? – input

+0

Ich bin mir nicht sicher, warum, aber ich bekomme den 'ArrayIndexOutOfBoundException' Fehler. – input

+0

PAGE_CENTER ist immer 1. focusPage wird beim Swifting auf 0 oder 2 gesetzt und nach dem Update wieder auf 1 gesetzt. isDragging entferne es einfach, mein Fehler. – SaintTail

4

Ich bin mir nicht sicher, ob ich das verstehen (nie viewPager verwendet werden, haben immer eine andere HorizontalViewSlider stattdessen verwendet), sondern auch für Ihre onPageScrollStateChanged(), warum Sie einen speziellen Fall haben Sie für focusedPage == 0 und focusedPage = = 2?

Wenn nichts besonderes über Jan und März ist, vielleicht entfernen Sie alles in onPageScrollStateChanged()?

Meine Vermutung ist, dass das Flackern von ist, wenn Sie setGridCellAdapter() aufrufen, weil das die Seite vom Aufrufen von notifyDataSetChanged aktualisiert.

+0

danke für deine antwort. Ich setze die Anzahl für den Viewpager auf 3 Ansichten gleichzeitig.Wenn ich also hin und her gehe, sollte der nächste und der vorherige Monat im Hintergrund geladen werden. Das habe ich aus der Logik hier verstanden: http://stackoverflow.com/questions/7440012/infinite-viewpager – input