2014-11-05 6 views
2

Я реализую FragmentStatePagerAdapter, который отлично работает, но getItem (int position) не имеет правильного значения все время.FragmentStatePagerAdapter.getItem() возвращает неправильную позицию

public class EventPagerAdapter extends FragmentStatePagerAdapter { 
    private static String LOG = "EVENTPAGER"; 
    private Calendar currentDate; 
    public EventPagerAdapter(FragmentManager fm) { 
     super(fm); 

     currentDate = Calendar.getInstance(); 
    } 

    public void setCurrentDate(Date date) { 
     currentDate.setTime(date); 
    } 

    @Override 
    public Fragment getItem(int i) { 
     Log.i(LOG, "item " + i); 
     // reset Date every time 
     currentDate.setTime(new Date()); 

     SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd"); 
     int days = (i > 50 ? i-50 : -50+i); 
     currentDate.add(Calendar.DATE, days);   
     String dateFormatted = fmt.format(currentDate.getTime()); 

     Bundle args = new Bundle(); 
     args.putString("calendarDate", dateFormatted); 

     Fragment fragment = new EventFragment(); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public int getCount() { 
     return 100; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     Log.i(LOG, "position " + position); 
     int days = 0; 
     days = (position > 49 ? position-49 : -49+position); 
     currentDate.setTime(new Date()); 
     currentDate.add(Calendar.DATE, days); 
     SimpleDateFormat fmt = new SimpleDateFormat("E, d.MMM"); 
     String dateFormatted = fmt.format(currentDate.getTime()); 

     return dateFormatted; 
    } 

Я хочу иметь 100 фрагментов, отображающих фрагмент 49 с текущей датой в качестве первого фрагмента. Прокрутка влево увеличивает дату на один день, прокручивание вправо уменьшит ее.

EventPagerAdapter eventPagerAdapter = new EventPagerAdapter(getSupportFragmentManager());  
ViewPager viewPager = (ViewPager) findViewById(R.id.pager); 

viewPager.setAdapter(eventPagerAdapter); 
viewPager.setCurrentItem(49); 

Это прекрасно работает для getPageTitle() метода, который имеет правильный индекс. Но getItem() нет. Любая идея почему? Это происходит потому, что эти фрагменты кэшируются?

ответ

0

Потому что getItem() вызывается только один раз для каждого элемента, я мог бы исправить свою проблему, реализовав SparseArray.

@Override 
public Fragment getItem(int position) { 
    Log.i(LOG, "item " + position); 
    // reset date every time 
    currentDate.setTime(new Date()); 

    int days = (position > 49 ? position-49 : -49+position); 
    currentDate.add(Calendar.DATE, days);   
    String dateFormatted = compareDateFormat.format(currentDate.getTime()); 

    Bundle args = new Bundle(); 
    args.putString("calendarDate", dateFormatted); 

    EventFragment fragment = new EventFragment(); 
    fragment.setArguments(args); 
    fragments.put(position, fragment); 
    return fragment; 
} 

@Override 
public Object instantiateItem(ViewGroup view, int position) { 
    EventFragment fragment = fragments.get(position); 
    if (fragment != null) { 
     return fragment; 
    } 
    else { 
     return super.instantiateItem(view, position); 
    } 
} 
Смежные вопросы