2017-09-18 17 views
0

最初の要素(インデックス0)に切り替えるときにアダプタが呼び出されないため、ViewPagerの最初の2ページは常に同じです。他のフラグメントはすべて正常に動作します。 getItem()の位置を使用すると完全に奇妙な位置が返されるため、私はViewPagerのgetCurrentItem()メソッドを使用しています。 TimetableActivity:android viewpagerは現在のアイテムを0に設定します

public class TimetableActivity extends FragmentActivity { 

private ViewPager mPager; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.screen_slide); 

    ActionBar actionBar = getActionBar(); 
    actionBar.setTitle("Stundenplan"); 
    actionBar.setIcon(new ColorDrawable(getResources().getColor(android.R.color.transparent))); 

    mPager = (ViewPager) findViewById(R.id.pager); 
    PagerAdapter mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager(), mPager); 
    mPager.setAdapter(mPagerAdapter); 
} 

@Override 
public void onBackPressed() { 
    if (mPager.getCurrentItem() == 0) { 
     super.onBackPressed(); 
    } else { 
     mPager.setCurrentItem(mPager.getCurrentItem() - 1); 
    } 
}} 

ScreenSlidePagerAdapter:

public class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { 

private ViewPager pager; 

public ScreenSlidePagerAdapter(FragmentManager fm, ViewPager pager) { 
    super(fm); 
    this.pager = pager; 
} 

@Override 
public Fragment getItem(int position) { 
    System.out.println("Current Item: " + pager.getCurrentItem()); 
    return ScreenSlidePageFragment.newInstance(pager.getCurrentItem()); 
} 

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

ScreenSlidePageFragment:

public class ScreenSlidePageFragment extends Fragment { 

private List<TableRow> rows; 
private int position; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.activity_timetable, container, false); 
    return rootView; 
} 

public static ScreenSlidePageFragment newInstance(int num) { 
    ScreenSlidePageFragment f = new ScreenSlidePageFragment(); 

    Bundle args = new Bundle(); 
    args.putInt("position", num); 
    f.setArguments(args); 

    return f; 
} 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    System.out.println("Called"); 

    ActionBar actionBar = getActivity().getActionBar(); 
    position = getArguments() != null ? getArguments().getInt("position") : 1; 

    System.out.println(position); 

    SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy"); 
    Calendar c = Calendar.getInstance(); 
    if (position == 5) { 
     actionBar.setTitle("Stundenplan (" + format.format(c.getTime()) + ")"); 
    } else if (position < 5) { 
     int daysBack = 5 - position; 
     c.add(Calendar.DAY_OF_MONTH, daysBack * -1); 
     actionBar.setTitle("Stundenplan (" + format.format(c.getTime()) + ")"); 
    } else { 
     int daysForward = position - 5; 
     c.add(Calendar.DAY_OF_MONTH, daysForward); 
     actionBar.setTitle("Stundenplan (" + format.format(c.getTime()) + ")"); 
    } 
}} 

だから、問題はgetCurrentItem()は誰も私を助けることができなかっ0 はないように思われることでしょうか?

答えて

0

getCurrentItemが0ではないことをどのように知っていますか?デバッグ時にその値を監視したか、またはアクティビティが戻るときに終了しなかったことがわかりましたか? 2番目の選択肢であれば、FragmentActivity onBackPressed()を知る必要があるので、それが空になるまでフラグメントのバックスタックをポップしてから、アクティビティを終了します。したがって、super.onBackPressed()の代わりに直接finish()を呼び出すことができます。

関連する問題