Sto sviluppando un'applicazione e attualmente sto cercando di aggiungere ScreenSlide
ad esso. Sono riuscito a farlo usando uno tutorial, ma il solito scorrimento tra le pagine x
non è esattamente quello che sto cercando.Scorrere tra i frammenti
Con il codice fornito di seguito è possibile scorrere tra 5 pagine, ma le pagine sono allineate in linea retta e non è possibile passare dalla prima pagina direttamente alla 5a e viceversa. Nella mia app ho 4 pagine. Quando faccio scorrere a sinistra, passaggio tra le prime 2 pagine, quando faccio scorrere a destra passaggio tra le ultime 2 pagine. Nell'immagine sottostante puoi vedere come il mio codice corrente cambia pagina e sotto di esso - il mio obiettivo.
public class MainActivity extends FragmentActivity {
private static final int NUM_PAGES = 5;
private ViewPager mPager;
private ScreenSlidePageFragment[] pages = new ScreenSlidePageFragment[NUM_PAGES];
private PagerAdapter mPagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_screen_slide);
mPager = (ViewPager) findViewById(R.id.pager);
mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
mPager.setAdapter(mPagerAdapter);
}
@Override
public void onBackPressed() {
if (mPager.getCurrentItem() == 0) {
super.onBackPressed();
} else {
mPager.setCurrentItem(mPager.getCurrentItem() - 1);
}
}
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUM_PAGES;
}
@Override
public Fragment getItem(int position) {
boolean moveRight = mPager.getCurrentItem() < position;
boolean moveLeft = mPager.getCurrentItem() > position;
switch(position){
case 5:
if(moveRight){
return geLog.w("i"
+ "Info", Integer.toString(position));
//return getPageByPosition(2);
if(moveLeft)
return getPageByPosition(2);
}
return new ScreenSlidePageFragment();
}
private Fragment getPageByPosition(int position){
int index = position - 1;
if(index < 0 || index > NUM_PAGES-1)
throw new InvalidParameterException("requested position is invalid");
if(pages[index] == null)
pages[index] = new ScreenSlidePageFragment();
return pages[index];
}
}
}
[UPDATE]
Sono riuscito a scrivere un codice che mi permette di far scorrere infinitamente a destra tra le 6 pagine diverse. La parte sinistra è però limitata - posso scivolare solo alla prima pagina (quindi se sono sulla prima pagina dopo aver pedalato 3 volte a destra, posso fare solo 3 cicli all'indietro). Penso di essere molto vicino a trovare la soluzione. Qualche idea?
MainActivity.java
public class MainActivity extends FragmentActivity {
private static final int NUM_PAGES = 6;
private ViewPager pager;
private PagerAdapter pagerAdapter;
private List<ScreenSlidePageFragment> slideList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
slideList = new ArrayList<ScreenSlidePageFragment>();
for (int i = 0; i<NUM_PAGES; i++){
ScreenSlidePageFragment slide = new ScreenSlidePageFragment();
slide.setIndex(i+1);
slideList.add(slide);
}
pager = (ViewPager) findViewById(R.id.pager);
pagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
pager.setAdapter(pagerAdapter);
}
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
int _pos = position % NUM_PAGES;
return slideList.get(_pos);
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
}
}
ScreenSlidePageFragment.java
public class ScreenSlidePageFragment extends Fragment {
private int index;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup root = (ViewGroup)inflater.inflate(R.layout.slide, container, false);
TextView tw = (TextView) root.findViewById(R.id.textView);
tw.setText(Integer.toString(index));
return root;
}
public void setIndex(int index){
this.index = index;
}
}
bel disegno :) – Sunny
Questo è un flusso così confuso in termini di permanenza della pagina e di esperienza dell'utente che consiglio vivamente di riconsiderare la progettazione della navigazione. Detto questo, probabilmente dovrai eseguire l'animazione e il riconoscimento dei gesti da solo, invece di utilizzare l'adattatore per cercapersone. Altrimenti sarà necessario modificare l'adattatore del cercapersone dopo ogni cambio di pagina. http://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html –
Ti ho dato +1 per il disegno :-) – Christine