Is there anyway to create a limited Fragment + ViewPager with Infinite Scrolling?
For example :
I am going to create 10 Fragment, when I scroll to the fifth Fragment, index number 0 Fragment destroyed and appear the eleventh Fragment
**1** 2 3 4 5 6 7 8 9 10
after scroll to the fifth
2 3 4 **5** 6 7 8 9 10 11
Variable
private static final int NUM_PAGES = 10;
Here is my Fragment adapter
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
}
#Override
public Fragment getItem(int position) {
return PageFragment.create(position);
}
#Override
public int getCount() {
return NUM_PAGES;
}
}
Here is the contain of the Fragment to show begin with number 1
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
ViewGroup rootView = (ViewGroup) inflater.inflate(
R.layout.fragment_view, container, false);
((TextView) rootView.findViewById(R.id.tvUsername)).setText(
""+ (mPageNumber + 1));
return rootView;
}
Here is when the selected event occur
mPager.setOnPageChangeListener(new OnPageChangeListener() {
#Override
public void onPageSelected(int pageSelected) {
// TODO Auto-generated method stub
Log.d(TAG, "selected = " + pageSelected);
if (pageSelected > (NUM_PAGES - 6)) {
//Event do it here?
}
}
#Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
#Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
Question :
How to create the event?
I think that can be done with changing the position value in the getItem().
But I don't know how to do it
The only way i could come up with is to make only three pages and when the user scrolls to the last page, you replace every fragment. Something like this:
The array
ArrayList<Integer> positions = new ArrayList<Integer>();
public void initPositions() {
positions.add(0);
positions.add(1);
positions.add(2);
}
The adapter
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
}
#Override
public Fragment getItem(int position) {
return PageFragment.create(positions.get(position));
}
#Override
public int getCount() {
return 3;
}
}
The listener
mPager.setOnPageChangeListener(new OnPageChangeListener() {
#Override
public void onPageSelected(int pageSelected) {
//scrolled to first page
if(pageSelected == 0) {
//Make sure its not unlimited upwards
if(positions.get(pageSelected == 0))
return;
//remove last and insert new at bottom
positions.remove(2);
positions.insert(0, positions.get(0) - 1);
//scrolled to last page
} else if(pageSelected == 2) {
//remove first and add one last
positions.remove(0);
positions.add((positions.get(1) + 1) % NUM_PAGES);
}
//make sure the adapter understands
mAdapter.notifyDataSetChanged();
//move pager to the middle again
mPager.setCurrentItem(1);
}
#Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
#Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
Not sure how this would work performancewise, or if it would work at all, but give it a shot :)
Related
I'm making use of ViewPagerIndicator, and I have my adapter defined like this:
public class MyPagerAdapter extends FragmentPagerAdapter implements
IconPagerAdapter {
private final static String TAB_ITEMS[] = { "Tab 1", "Tab 2", "Tab 3", "Tab 4"};
private int count = TAB_ITEMS.length;
public MyPagerAdapter (FragmentManager fm) {
super(fm);
}
#Override
public int getIconResId(int index) {
// TODO Auto-generated method stub
return 0;
}
#Override
public Fragment getItem(int position) {
Fragment fragment = new BaseFragment();
return fragment;
}
#Override
public int getCount() {
return count;
}
And this is my activity that will contain my fragments:
public class MyActivity extends FragmentActivity implements
OnPageChangeListener {
private int tabPosition;
#Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager pager = (ViewPager) findViewById(R.id.pager);
MyPagerAdapter adapter = new MyPagerAdapter (
getSupportFragmentManager());
pager.setAdapter(adapter);
UnderlinePageIndicator indicator = (UnderlinePageIndicator) findViewById(R.id.indicator);
indicator.setFades(false);
indicator.setViewPager(pager);
indicator.setOnPageChangeListener(this);
}
#Override
public void onPageScrollStateChanged(int state) {
// TODO Auto-generated method stub
}
#Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
// TODO Auto-generated method stub
}
#Override
public void onPageSelected(int position) {
// TODO Auto-generated method stub
setTabPosition(position);
Toast.makeText(MyActivity.this,
"Changed to page: " + position, Toast.LENGTH_SHORT).show();
}
public void setTabPosition(int position) {
this.tabPosition = position;
}
public int getTabPosition() {
return this.tabPosition;
}
}
Finally the definition of BaseFragment:
public class BaseFragment extends Fragment implements OnItemClickListener {
private final static String TAG = "BaseFragment";
private int tabPosition;
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_base, container,
false);
return view;
}
#Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
#Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
tabPosition = ((MyActivity) getActivity()).getTabPosition();
Toast.makeText(getActivity(), "page " + tabPosition, Toast.LENGTH_SHORT)
.show();
}
Now , this is my problem:
The toast in onPageSelected of the activity always shows the correct page when a new page is selected or swiped to.
However, the toast in my fragment only shows the correct page when you swipe to either page 1 or page 2. The only time it toasts page 0 is anytime the app is launched. After that, when the user swipes to page 0 or page 4, no toast is shown at all, not even an empty toast.
I wrote the getTabPosition() and setTabPosition() methods with the intention of getting the current selected tab position in the fragment, but it obviously doesn't work correctly hence I dont get toasts on pages 0 and 4.
My question is: how do I get the selected page position in my BaseFragment, since I need that position to load the appropriate data?
Hope I was clear enough?
Each Fragment will display a different set of data, then maybe it is a good idea to have one fragment for each. Here is what I did to display different Fragments for different data in the FragmentPagerAdapter:
#Override
public Fragment getItem(int index) {
Fragment fragment = null;
// Define the page for each index
switch(index){
case 0:
fragment = new Fragment1();
break;
case 1:
fragment = new Fragment2();
break;
case 2:
fragment = new Fragment3();
break;
}
This may not be the best approach but in your activity that holds reference to ViewPager try this:
public class TabbedViewActivity extends FragmentActivity {
ViewPager viewPager;
public static int tabIndex = 0;
#Override
protected void onCreate(Bundle bundle) {
......
viewPager = (ViewPager)findViewById(R.id.pager);
TabbedViewActivity.tabIndex = 0; // in the start index is always 0 unless coded otherwise
viewPager.setOnPageChangeListener(
new ViewPager.SimpleOnPageChangeListener() {
#Override
public void onPageSelected(int position) {
TabbedViewActivity.tabIndex = position;
}
});
}
Then you can always access this variable statically like this in your Fragment TabbedViewActivity.tabIndex
pager.getCurrentItem();
it return current fragment index
Hi I have a Swipe Tab Fragment Activity that contains Three Fragments. I created my own adapter that extends FragmentStatePageAdapter.
Now here I'll explain how each tab (Fragments) works.
In Tab 1 and Tab 2, I have a list with practically the same type, when I mean type, I mean they are Symptoms (fever, pain in the eyes, etc.).
Now Tab 3 serves as a tray. Whenever I select an item from the listview in either Tab 1 or Tab 2, I want to transfer that item to Tab 3 and remove that Item from the List where it was selected.
I have tried implementing an Interface but it didn't work for me since I added the fragments on the Main FragmentActivity through an Adapter. MY questions is
How can I communicate the three Fragments? Meaning how can I pass data between these fragment.
Now if you want to take a look at what I've done for now, here it is:
I depicted this as Tab 2 in my question
public class FragmentGeneralSymptoms extends ListFragment implements OnItemClickListener {
ArrayList<String> symptomList;
String name;
String selected;
Tray tray;
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.fragment_generalsymptoms, container,
false);
}
#Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
Bundle args = getArguments();
name = args.getString("key");
tray = (Tray) getActivity();
new LoadSymptoms().execute();
}
class LoadSymptoms extends AsyncTask<String, String, String> {
#Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
KnowledgeBaseHelper helper = new KnowledgeBaseHelper(getActivity());
ProfileHandler handler = new ProfileHandler(getActivity());
Profiles profile = handler.getProfile(name);
String age = profile.getAge() + "";
String gender = profile.getGender();
symptomList = helper.getSymptomList(name, age, gender);
return null;
}
#Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
setListAdapter(new ArrayAdapter<String>(getActivity(),
R.layout.general_list, symptomList));
}
}
#Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
// TODO Auto-generated method stub
selected = symptomList.get(arg2);
tray.respond(selected);
}
}
My Tab 3
public class FragmentTray extends ListFragment{
private ArrayList<String> selectedList;
public FragmentTray(){}
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.fragment_tray, container, false);
}
public void addToTray(String symptom){
selectedList.add(symptom);
setListAdapter(new ArrayAdapter<String>(getActivity(),
R.layout.general_list, selectedList));
}
public void removeSymptom(String string){
selectedList.remove(selectedList.indexOf(string));
}
}
My MainActivity which Extends FragmentActivity
public class MainActivity extends FragmentActivity implements TabListener, OnPageChangeListener, Tray {
private String selectedProfileName;
ActionBar actionBar;
ViewPager viewPager;
#Override
protected void onCreate(Bundle arg0) {
// TODO Auto-generated method stub
super.onCreate(arg0);
setContentView(R.layout.main_activity);
Bundle args = getIntent().getExtras();
selectedProfileName = args.getString("key_name");
viewPager = (ViewPager) findViewById(R.id.main_pager);
viewPager.setAdapter(new MyAdapter(getSupportFragmentManager()));
viewPager.setOnPageChangeListener(this);
InitializeActionBar();
}
public void InitializeActionBar() {
actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
ActionBar.Tab tabBodyPart = actionBar.newTab();
tabBodyPart.setText("Body Parts");
tabBodyPart.setTabListener(MainActivity.this);
ActionBar.Tab tabGeneralSymptoms = actionBar.newTab();
tabGeneralSymptoms.setText("General Symptoms");
tabGeneralSymptoms.setTabListener(MainActivity.this);
ActionBar.Tab tabSelectedSymptoms = actionBar.newTab();
tabSelectedSymptoms.setText("Selected Symptoms");
tabSelectedSymptoms.setTabListener(MainActivity.this);
actionBar.addTab(tabBodyPart);
actionBar.addTab(tabGeneralSymptoms);
actionBar.addTab(tabSelectedSymptoms);
}
#Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
viewPager.setCurrentItem(tab.getPosition());
}
class MyAdapter extends FragmentStatePagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
// TODO Auto-generated constructor stub
}
#Override
public Fragment getItem(int arg0) {
// TODO Auto-generated method stub
Fragment fragment = null;
Bundle bundle = new Bundle();
bundle.putString("key", selectedProfileName);
if (arg0 == 0) {
fragment = new FragmentBodyPart();
fragment.setArguments(bundle);
}
if (arg0 == 1) {
fragment = new FragmentGeneralSymptoms();
fragment.setArguments(bundle);
}
if (arg0 == 2) {
fragment = new FragmentTray();
}
return fragment;
}
#Override
public int getCount() {
// TODO Auto-generated method stub
return 3;
}
}
#Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
actionBar.setSelectedNavigationItem(arg0);
}
#Override
public void respond(String string) {
// TODO Auto-generated method stub
FragmentTray frag2 = new FragmentTray();
frag2.addToTray(string);
}
}
Finally my Interface
public interface Tray {
public void respond(String string);
}
what I usually do is:
1.- Define the interface. It's done, fine.
2.- Your FragmentGeneralSymptoms must have an initializated listener. Yuou're that but you forgot to set the listener in the class.
public class FragmentGeneralSymptoms extends ListFragment implements OnItemClickListener {
ArrayList<String> symptomList;
String name;
String selected;
Tray tray;
(your code)
public void setTrayListener(Tray listener)
{
tray = listener;
}
#Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
// TODO Auto-generated method stub
selected = symptomList.get(arg2);
if(tray != null)
{
symptomList.remove(selected); // if you want to remove this element from this list
tray.respond(selected);
}
} }
3.- Your FragmentTray class must implement the interface:
public class FragmentTray extends ListFragment implements Tray{
private ArrayList<String> selectedList;
public FragmentTray(){}
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.fragment_tray, container, false);
}
public void addToTray(String symptom){
selectedList.add(symptom);
setListAdapter(new ArrayAdapter<String>(getActivity(),
R.layout.general_list, selectedList));
}
public void removeSymptom(String string){
selectedList.remove(selectedList.indexOf(string));
}
public void respond(String name)
{
// do stuffs!!!!
selectedList.add(new Symtom(name)); // for example
System.out.println("Inside the respond method respond in FragmentTray class");
}
}
4.- And last but not least. When you build the fragments you must register the listener:
class MyAdapter extends FragmentStatePagerAdapter {
private List<Fragment> fragmentList;
public MyAdapter(FragmentManager fm) {
super(fm);
// TODO Auto-generated constructor stub
fragmentList = new ArrayList<Fragment>();
Fragment fragmentBodyPart = new FragmentBodyPart();
Fragment fragmentTray = new FragmentTray();
Fragment fragmentGeneralSymptoms = new FragmentGeneraSymptoms();
// this is important*********************************
fragmentGeneraSmptoms.setTrayListener(fragmentTray);
fragmentList.add(fragmentBodyPart);
fragmentList.add(fragmentGeneralSymptoms);
fragmentList.add(fragmentTray);
}
#Override
public Fragment getItem(int arg0) {
// TODO Auto-generated method stub
Fragment fragment = null;
Bundle bundle = new Bundle();
bundle.putString("key", selectedProfileName);
if (arg0 == 0) {
fragment = (Fragment) fragmentList.get(0);
fragment.setArguments(bundle);
}
if (arg0 == 1) {
fragment = (Fragment) fragmentList.get(1);
fragment.setArguments(bundle);
}
if (arg0 == 2) {
fragment = (Fragment) fragmentList.get(2);
}
return fragment;
}
#Override
public int getCount() {
// TODO Auto-generated method stub
return fragmentList.size();
}
}
I hope that it helps.
I am using a view pager with only one fragment.
I am doing this as the basic layout of the page would remain the same, only some of the details like text view and images would change and so I am re-using the same fragment for each
page in the view pager.
The question is that where and how do i pass the information to the fragment that I am currently on so and so page (ex: page#3). once the fragment has this information, it would be able to adjust its view/layout and display the following information.
could someone please help?
Thanks.
When you add fragment dynamically into your viewpager use this way:
class ParentPagerAdapter extends FragmentPagerAdapter implements ViewPager.OnPageChangeListener {
private ArrayList<Fragment> fragments;
public ParentPagerAdapter(FragmentManager fm,
ArrayList<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
#Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
#Override
public int getCount() {
return fragments.size();
}
#Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
#Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
#Override
public void onPageSelected(int position) {
// TODO Auto-generated method stub
((MYFragment)this.fragments.get(position)).updateLayout();
}
}
Attach instance of adapter as ViewPager's OnPageChangeListener().
Like this mPager.setOnPageChangeListener(myParentPagerAdapter);
either keep an instance of the fragment once you create it or use
MyFragment myFrag = (MyFragment)getFragmentManager().findFragmentById(r.id.myfragment);
to get the fragment by its id
mPager.setOnPageChangeListener(new OnPageChangeListener(){
#Override
public void onPageScrollStateChanged(int state) {
}
#Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
#Override
public void onPageSelected(int currentPage) {
MyFragment myFrag = (MyFragment)getFragmentManager().findFragmentById(r.id.myfragment);
myFrag.updateLayout(currentPage);
}
});
I am using view-pager.In that I have three tabs : 1. History , 2. Main , 3. Map .
I have stopwatch into main activity.When I press the start and then after stop at that time value of the stopwatch add into the sqlite DB. And into history activity I am fetching the value of stopwatch from DB and store into the listview. It's working perfect.
But now I want the update the History activity when I swipe from the Main > History so After press the stop button,I got the last value into listview of history activity.
My question is how can I update the view on swipe the viewpager?
public class SwipeyTabsSampleActivity extends FragmentActivity {
private static final String [] TITLES = {
"HISTORY",
"MAIN",
"MAP"
};
private SwipeyTabs mTabs;
private ViewPager mViewPager;
//Handler handler=new Handler();
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_swipeytab);
mViewPager = (ViewPager) findViewById(R.id.viewpager);
mTabs = (SwipeyTabs) findViewById(R.id.swipeytabs);
SwipeyTabsPagerAdapter adapter = new SwipeyTabsPagerAdapter(this,
getSupportFragmentManager());
mViewPager.setAdapter(adapter);
mTabs.setAdapter(adapter);
mViewPager.setOnPageChangeListener(mTabs);
mViewPager.setCurrentItem(1);
mViewPager.setOffscreenPageLimit(3);
}
private class SwipeyTabsPagerAdapter extends FragmentPagerAdapter implements
SwipeyTabsAdapter, ViewPager.OnPageChangeListener {
private final Context mContext;
ViewPager viewpager;
public SwipeyTabsPagerAdapter(Context context, FragmentManager fm, ViewPager mViewPager) {
super(fm);
this.mContext = context;
viewpager = mViewPager;
//viewpager.setAdapter(this);
viewpager.setOnPageChangeListener(this);
}
#Override
public Fragment getItem(int position) {
Fragment f = new Fragment();
switch (position) {
case 0:
f = History.newInstance(position);
break;
case 1:
f = Main.newInstance(position);
break;
case 2:
f = Map.newInstance(position);
break;
}
return f;
}
#Override
public int getCount() {
return TITLES.length;
}
#Override
public void destroyItem(ViewGroup container, int position, Object object) {
ViewPager pager = (ViewPager) container;
View view = (View) object;
pager.removeView(view);
}
public TextView getTab(final int position, SwipeyTabs root) {
TextView view = (TextView) LayoutInflater.from(mContext).inflate(
R.layout.swipey_tab_indicator, root, false);
view.setText(TITLES[position]);
view.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mViewPager.setCurrentItem(position);
}
});
return view;
}
#Override
public void onPageScrollStateChanged(int state) {
// TODO Auto-generated method stub
}
#Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// TODO Auto-generated method stub
}
#Override
public void onPageSelected(int positiion) {
// TODO Auto-generated method stub
}
}
}
Add ViewPager OnPageChangeListener:
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
#Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
#Override
public void onPageSelected(int position) {
// your code here
}
#Override
public void onPageScrollStateChanged(int state) {
}
});
This will affect the changes from one page to another page in view pager.
OnPageChangeListener pagechangelistener =new OnPageChangeListener() {
#Override
public void onPageSelected(int arg0) {
Logger.logMessage("Called first");
pageAdapter.notifyDataSetChanged();
indicator.setCurrentItem(arg0);
}
#Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
Logger.logMessage("Called second");
}
#Override
public void onPageScrollStateChanged(int arg0) {
Logger.logMessage("Called third");
}
};
myViewPager.setOnPageChangeListener(pagechangelistener);
Use this in your page adapter.
#Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
Take one string and add the Getters and setters into your FragmentActivity class.
Like...
String HistoryFragment;
public String getHistoryFragment() {
return HistoryFragment;
}
public void setHistoryFragment(String historyFragment) {
HistoryFragment = historyFragment;
}
Then after we can access another fragment from our current fragment by calling findFragmentByTag(<tag of target fragment>).
For the more information check the link Communication between Fragments in ViewPager.
Have you tried implementing OnPageChanged`? You can capture when the user start swiping.
do pager.setOnPageChanged(new ....) and Eclipse will show you the methods you can override.
Then you can override onPageScrollStateChanged(int state)
onPageScrollStateChanged(int state){
if (state==OnPageChangeListener.SCROLL_STATE_DRAGGING){
// update here
}
}
This question already has answers here:
Closed 10 years ago.
Possible Duplicate:
ViewPager as a circular queue / wrapping
I have three fragment classes in my code.
FirstActivity,SecondActivity,ThirdActivity i want to swipe these three activities.. these three are extend from Fragment class
public class ViewPagerFragmentActivity extends FragmentActivity {
private PagerAdapter mPagerAdapter;
#Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
super.setContentView(R.layout.viewpager_layout);
initialisePaging();
}
/**
* Initialize the fragments to be paged
*/
List<Fragment> fragments = new Vector<Fragment>();
ViewPager pager;
private void initialisePaging() {
fragments.add(Fragment.instantiate(this, FirstActivity.class.getName()));
fragments.add(Fragment.instantiate(this, SecondActivity.class.getName()));
fragments.add(Fragment.instantiate(this, ThirdActivity.class.getName()));
this.mPagerAdapter = new MyPagerAdapter(super.getSupportFragmentManager(), fragments);
pager = (ViewPager) super.findViewById(R.id.viewpager);
pager.setAdapter(this.mPagerAdapter);
}
}
and here is my FragmentPageAdapter class
public class MyPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> fragments;
public MyPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
#Override
public Fragment getItem(int position) {
System.out.println("position"+position);
return this.fragments.get(position);
}
#Override
public int getCount() {
return this.fragments.size();
}
}
my code is working in this way A<->B<->c
but my requirement is to run like this wayC<->A<->B<->C<-A->
that is in circular fragments are swipable...
Circular ViewPager is possible.
With the help of ViewPager as a circular queue / wrapping this link have coded like this. Hope it helps what you needed.
The CircluarPagerAdapter class:
>
public class CircularPagerAdapter extends PagerAdapter{
private int[] pageIDsArray;
private int count;
public CircularPagerAdapter(final ViewPager pager, int... pageIDs) {
super();
int actualNoOfIDs = pageIDs.length;
count = actualNoOfIDs + 2;
pageIDsArray = new int[count];
for (int i = 0; i < actualNoOfIDs; i++) {
pageIDsArray[i + 1] = pageIDs[i];
}
pageIDsArray[0] = pageIDs[actualNoOfIDs - 1];
pageIDsArray[count - 1] = pageIDs[0];
pager.setOnPageChangeListener(new OnPageChangeListener() {
public void onPageSelected(int position) {
int pageCount = getCount();
if (position == 0){
pager.setCurrentItem(pageCount-2,false);
} else if (position == pageCount-1){
pager.setCurrentItem(1,false);
}
}
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// TODO Auto-generated method stub
}
public void onPageScrollStateChanged(int state) {
// TODO Auto-generated method stub
}
});
}
public int getCount() {
return count;
}
public Object instantiateItem(View container, int position) {
LayoutInflater inflater = (LayoutInflater) container.getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
int pageId = pageIDsArray[position];
View view = inflater.inflate(pageId, null);
((ViewPager) container).addView(view, 0);
return view;
}
#Override
public void destroyItem(View container, int position, Object object) {
((ViewPager) container).removeView((View) object);
}
#Override
public void finishUpdate(View container) {
// TODO Auto-generated method stub
}
#Override
public boolean isViewFromObject(View view, Object object) {
return view == ((View) object);
}
#Override
public void restoreState(Parcelable state, ClassLoader loader) {
// TODO Auto-generated method stub
}
#Override
public Parcelable saveState() {
// TODO Auto-generated method stub
return null;
}
#Override
public void startUpdate(View container) {
// TODO Auto-generated method stub
}
}
and this is your main class:
>
public class MainActivity extends Activity {
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager myPager = (ViewPager) findViewById(R.id.conpageslider);
PagerAdapter adapter = new CircularPagerAdapter(myPager, new int[]{R.layout.first_activity, R.layout.second_activity, R.layout.third_activity});
myPager.setAdapter(adapter);
myPager.setCurrentItem(3);
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
You can try something like this :
1) Make getCount() return a huge value ( a number of swipe way higher than what your user might use )
2) Make getItem return something like this.fragments.get(position % fragments.size())
3) Make your pager start somewhere in the middle of the range defined by getCount() ( To allow swiping from A to C at the beginning ), make sure to choose a value which will give you the first fragment % 3
I'm aware this solution seems a bit dirty but I cant find a better one at the moment