android - FragmentStatePagerAdapter.getItem() 返回错误的位置

标签 android

我正在实现一个工作正常的 FragmentStatePagerAdapter,但 getItem(int position) 并非始终具有正确的值。

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 个 fragment 显示第 49 个 fragment ,当前日期作为第一个 fragment 。向左滑动会增加一天的日期,向右滑动会减少一天。

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

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

这适用于具有正确索引的 getPageTitle() 方法。但是 getItem() 没有。知道为什么吗?这是因为这些 fragment 被缓存了吗?

最佳答案

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

关于android - FragmentStatePagerAdapter.getItem() 返回错误的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26768832/

相关文章:

java - 加快 Firebase 存储下载

java - 在android的服务中调用位置管理器两次

java - LocationManager 在 Android 中使用 getLastKnownLocation 返回空经度

c# - Xamarin Entry 底线颜色不变

android - 如何查找日历内容提供者是否存在

android - 如何修改 Android 手势视觉效果(用于屏幕手势检测)?

java - 如果设备是纵向的,MediaStore.ACTION_VIDEO_CAPTURE 会使相机应用程序崩溃

android - 当回收器 View 放置在 nestedscrollview 中时,PagedListAdapter 获取所有项目

android - Android 设备上的 GPU 编程

android - 自定义抽屉导航中的导航 View 仅包含 ImageView