2015-12-27 3 views
11

Ok, also brauchte ich einen kreisförmigen ViewPager. Ich hatte wirklich Schwierigkeiten, es umzusetzen. Nun, da ich es implementiert habe und es funktioniert gut, soweit kreisförmige Scroll betrifft. Aber ich habe ein Problem bemerkt. Was nach der ersten Runde von Scrollfragmenten nicht funktioniert. Ich habe drei Fragmente mit einem Knopf in ihnen. Button funktioniert in der ersten Runde, aber wenn ich zurück zur ersten Seite komme funktioniert nicht. p.s habe ich gefälschte Seiten Technik verwendet, um Viewpager rund zu machen.Circular ViewPager. Fragmente funktionieren nach der ersten Runde nicht so wie sie sollten

Hier Code

 mViewPager.setAdapter(new PagerAdapter(getSupportFragmentManager(), this)); 
    //mViewPager.setOnPageChangeListener(new CircularViewPagerHandler(mViewPager)); 
    mViewPager.setCurrentItem(1, false); 
    mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

     } 

     @Override 
     public void onPageSelected(int position) { 
      if (position == 0) { 
       mViewPager.setCurrentItem(3, false); 
       Log.d("TAG", 
         "Swiped before first page, looping and resetting to last page."); 
      } else if (position == 4) { 
       mViewPager.setCurrentItem(1, false); 
       Log.d("TAG", 
         "Swiped beyond last page, looping and resetting to first page."); 
      } 
     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 
      Log.d("onPageScrollState", "state:" + state); 
      int currentPage = mViewPager.getCurrentItem(); 
      if(currentPage==1){ 
       imgCenter.setImageResource(R.drawable.take_ride); 
       imgLeft.setImageResource(R.drawable.give_ride); 
       imgRight.setImageResource(R.drawable.setting); 
      } 
      if(currentPage==2){ 
       imgCenter.setImageResource(R.drawable.setting); 
       imgRight.setImageResource(R.drawable.take_ride); 
       imgLeft.setImageResource(R.drawable.give_ride); 
      } 
      if (currentPage==3){ 
       imgCenter.setImageResource(R.drawable.give_ride); 
       imgLeft.setImageResource(R.drawable.take_ride); 
       imgRight.setImageResource(R.drawable.setting); 

      } 
     } 
    }); 

hier ist PagerAdapter Klasse

public class PagerAdapter extends FragmentPagerAdapter { 

Context mcontext; 

public PagerAdapter(FragmentManager fm, Context context) { 
    super(fm); 
    mcontext = context; 
} 

@Override 
public Fragment getItem(int position) { 
    if (position == 0) { 
     return new HomeFragment2(); 
    } 
    else if(position==1){ 
     return new HomeFragment(); 
    } 
    else if (position == 2) { 
     return new SettingFragment(); 
    } 
    else if(position==3){ 
     return new HomeFragment2(); 
    } 
    else 
     return new HomeFragment(); 
} 

@Override 
public int getCount() { 
    return 5; 
} 
} 
+0

Probieren Sie diese [Wie man zirkuliertes Scrollen auf ViewPager macht] (http://stackoverflow.com/questions/21368693/how-to-do-circular-scrolling-on-viewpager), [CircularViewPager] (https: // github.com/TobiasBuchholz/CircularViewPager) –

+1

Eigentlich ist das Problem mit Fragmenten. Fragmente funktionieren nicht, aber zirkulares Scrollen ist Arbeit. Fragment funktioniert nur, wenn ich nicht kreisförmig scrollen –

Antwort

5

ich einen einfachen Test-App mit Ihnen PagerAdapter und einfache Fragment s mit einem Button erstellt haben:

enter image description here

Und es funktioniert gut!

Ich habe den Quellcode here hochgeladen, so können Sie es überprüfen und sehen, ob es einen Unterschied zu Ihrem gibt.

Als Fragment ‚s ich verwendet:

public class FragmentA extends android.support.v4.app.Fragment { 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_a, container, false); 
     rootView.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Snackbar.make(v, "Hi, fragment A", Snackbar.LENGTH_SHORT).show(); 
      } 
     }); 
     return rootView; 
    } 
} 

was So kann ich

empfehlen
  • ersetzen Ihre Fragmente mit einigen Dummy-one (wie die oben). Wenn es funktioniert - das Problem ist in der Fragment Code, nicht in der Circular ViewPager

  • Wenn es immer noch nicht funktioniert - ich würde versuchen, anstatt Fragmente mehrmals neu erstellen - erstellen Sie sie einmal und speichern:

    public class PagerAdapter extends FragmentPagerAdapter { 
        Context mcontext; 
        Fragment [] fragments; 
        public PagerAdapter(FragmentManager fm, Context context, Fragment [] fragments) { 
         super(fm); 
         mcontext = context; 
         this.fragments = fragments; 
        } 
    
        @Override 
        public Fragment getItem(int position) { 
         return fragments[position]; 
        } 
    
        @Override 
        public int getCount() { 
         return fragments.length; 
        } 
    } 
    

    Und in Activity:

    Fragment[] fragments = { 
         Fragment.instantiate(this, FragmentC.class.getName()), 
         Fragment.instantiate(this, FragmentA.class.getName()), 
         Fragment.instantiate(this, FragmentB.class.getName()), 
         Fragment.instantiate(this, FragmentC.class.getName()), 
         Fragment.instantiate(this, FragmentA.class.getName()), 
    }; 
    ..... 
    viewPager.setAdapter(new PagerAdapter(getSupportFragmentManager(), this, fragments)); 
    

Lassen sie mich wissen, wenn es hilft!

+0

Danke für die Beantwortung. Ich werde Ihre Lösung überprüfen, wenn das funktioniert, dann werde ich Ihre Antwort akzeptieren. –

+0

Warum haben Sie in OnActivityCreated() {} kein onClick-Ereignis übergeben? –

+0

Danke, es funktioniert. Aber jetzt bitte erklären. Warum funktionierte es nicht, wenn ich Button-Ereignisse innerhalb von ActivityCreated() abfeuern wollte? –