Календарь и PagerAdapter – Неограниченные виды

В своей деятельности я использую ViewPager для прокрутки влево / вправо и соответственно просмотра месяца. Я onCreate значения месяца и года из onCreate в PagerAdapter:

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

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

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

Основываясь на коде Jon Willis , это то, что я придумал, но когда позиция viewpager равна 0 или 2, страница становится пустой, а затем отображает следующий месяц + 1 (то есть после того, как я прокручиваю январь, Страница мерцает и отображает март). Он не прокручивается плавно. Я не знаю, как это сделать.

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

Solutions Collecting From Web of "Календарь и PagerAdapter – Неограниченные виды"

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

В Главном

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

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

onPageSelected

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

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

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

Это не идеально, потому что пользователь слишком быстро работает. Прокрутка не изменяется до простоя, а затем ViewPager достигает своего конца.

Я не уверен, что понимаю это (никогда не использовал этот viewPager, всегда использовал другой HorizontalViewSlider), но для вашего onPageScrollStateChanged () почему у вас есть специальный случай для focusPage == 0 и focusPage == 2?

Если ничего особенного в январе и марте, возможно, удалите все внутри onPageScrollStateChanged ()?

Я предполагаю, что мерцание происходит, когда вы вызываете setGridCellAdapter (), потому что это обновит страницу от вызова notifyDataSetChanged.