Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在android中实现ViewPager滚动无限_Java_Android - Fatal编程技术网

Java 在android中实现ViewPager滚动无限

Java 在android中实现ViewPager滚动无限,java,android,Java,Android,我创建了一个带有两个选项卡的ViewPager,但考虑到要实现更多,为此,我首先尝试使我的选项卡无限滚动,不幸的是,我无法使ViewPager无限滚动。请帮忙。 /使用Eclipse/ 这些是我的课程: MainActivity.java: public class MainActivity extends FragmentActivity { ActionBar mActionBar; ViewPager mPager; private int focusedPage = 0; @Over

我创建了一个带有两个选项卡的ViewPager,但考虑到要实现更多,为此,我首先尝试使我的选项卡无限滚动,不幸的是,我无法使ViewPager无限滚动。请帮忙。 /使用Eclipse/ 这些是我的课程:

MainActivity.java:

public class MainActivity extends FragmentActivity {

ActionBar mActionBar;
ViewPager mPager;
private int focusedPage = 0;

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


    /** Getting a reference to action bar of this activity */
    mActionBar = getActionBar();

    /** Set tab navigation mode */
    mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    /** Getting a reference to ViewPager from the layout */
    mPager = (ViewPager) findViewById(R.id.pager);

    /** Getting a reference to FragmentManager */
    FragmentManager fm = getSupportFragmentManager();


    /** Defining a listener for pageChange */
    ViewPager.SimpleOnPageChangeListener pageChangeListener = new ViewPager.SimpleOnPageChangeListener(){
        @Override
        public void onPageSelected(int position) {              
            super.onPageSelected(position);
            mActionBar.setSelectedNavigationItem(position); 


        }

         @Override
         public void onPageScrolled(int arg0, float arg1, int arg2) {
         }

         @Override
         public void onPageScrollStateChanged(int arg0) {
         }
    };

    /** Setting the pageChange listner to the viewPager */
    mPager.setOnPageChangeListener(pageChangeListener);

    /** Creating an instance of FragmentPagerAdapter */
    MyFragmentPagerAdapter fragmentPagerAdapter = new MyFragmentPagerAdapter(fm);


    /** Setting the FragmentPagerAdapter object to the viewPager object */
    mPager.setAdapter(fragmentPagerAdapter);

    mActionBar.setDisplayShowTitleEnabled(true);

    /** Defining tab listener */
    ActionBar.TabListener tabListener = new ActionBar.TabListener() {

        @Override
        public void onTabReselected(Tab arg0,
                android.app.FragmentTransaction arg1) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onTabSelected(Tab tab,
            android.app.FragmentTransaction ft) {
            mPager.setCurrentItem(tab.getPosition());

        }

        @Override
        public void onTabUnselected(Tab tab,
                android.app.FragmentTransaction ft) {
            // TODO Auto-generated method stub

        }
    };

    /** Creating Android Tab */
    Tab tab = mActionBar.newTab()
                       .setText("Android")
                       .setIcon(R.drawable.android)
                       .setTabListener(tabListener);

    mActionBar.addTab(tab);

    /** Creating Apple Tab */
    tab = mActionBar.newTab()
                   .setText("Apple")
                   .setIcon(R.drawable.apple)
                   .setTabListener(tabListener);                               

    mActionBar.addTab(tab);        




}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

 public void onTabReselected(Tab tab, FragmentTransaction ft) {
    }

    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        // on tab selected
        // show respected fragment view
        mPager.setCurrentItem(tab.getPosition());
    }

    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    }

}
public class MyFragmentPagerAdapter extends FragmentPagerAdapter{

final int PAGE_COUNT = 2;

/** Constructor of the class */
public MyFragmentPagerAdapter(FragmentManager fm) {
    super(fm);

}

/** This method will be invoked when a page is requested to create */
@Override
public Fragment getItem(int arg0) {
    Bundle data = new Bundle();
    switch(arg0){

        /** Android tab is selected */
        case 0:
            AndroidFragment androidFragment = new AndroidFragment();                
            data.putInt("current_page", arg0+1);
            androidFragment.setArguments(data);
            return androidFragment;

        /** Apple tab is selected */
        case 1:
            AppleFragment appleFragment = new AppleFragment();
            data.putInt("current_page", arg0+1);
            appleFragment.setArguments(data);
            return appleFragment;   
    }

    return null;
}

/** Returns the number of pages */
@Override
public int getCount() {     
    return PAGE_COUNT;
}   
}
MyFragmentPagerAdapter.java:

public class MainActivity extends FragmentActivity {

ActionBar mActionBar;
ViewPager mPager;
private int focusedPage = 0;

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


    /** Getting a reference to action bar of this activity */
    mActionBar = getActionBar();

    /** Set tab navigation mode */
    mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    /** Getting a reference to ViewPager from the layout */
    mPager = (ViewPager) findViewById(R.id.pager);

    /** Getting a reference to FragmentManager */
    FragmentManager fm = getSupportFragmentManager();


    /** Defining a listener for pageChange */
    ViewPager.SimpleOnPageChangeListener pageChangeListener = new ViewPager.SimpleOnPageChangeListener(){
        @Override
        public void onPageSelected(int position) {              
            super.onPageSelected(position);
            mActionBar.setSelectedNavigationItem(position); 


        }

         @Override
         public void onPageScrolled(int arg0, float arg1, int arg2) {
         }

         @Override
         public void onPageScrollStateChanged(int arg0) {
         }
    };

    /** Setting the pageChange listner to the viewPager */
    mPager.setOnPageChangeListener(pageChangeListener);

    /** Creating an instance of FragmentPagerAdapter */
    MyFragmentPagerAdapter fragmentPagerAdapter = new MyFragmentPagerAdapter(fm);


    /** Setting the FragmentPagerAdapter object to the viewPager object */
    mPager.setAdapter(fragmentPagerAdapter);

    mActionBar.setDisplayShowTitleEnabled(true);

    /** Defining tab listener */
    ActionBar.TabListener tabListener = new ActionBar.TabListener() {

        @Override
        public void onTabReselected(Tab arg0,
                android.app.FragmentTransaction arg1) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onTabSelected(Tab tab,
            android.app.FragmentTransaction ft) {
            mPager.setCurrentItem(tab.getPosition());

        }

        @Override
        public void onTabUnselected(Tab tab,
                android.app.FragmentTransaction ft) {
            // TODO Auto-generated method stub

        }
    };

    /** Creating Android Tab */
    Tab tab = mActionBar.newTab()
                       .setText("Android")
                       .setIcon(R.drawable.android)
                       .setTabListener(tabListener);

    mActionBar.addTab(tab);

    /** Creating Apple Tab */
    tab = mActionBar.newTab()
                   .setText("Apple")
                   .setIcon(R.drawable.apple)
                   .setTabListener(tabListener);                               

    mActionBar.addTab(tab);        




}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

 public void onTabReselected(Tab tab, FragmentTransaction ft) {
    }

    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        // on tab selected
        // show respected fragment view
        mPager.setCurrentItem(tab.getPosition());
    }

    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    }

}
public class MyFragmentPagerAdapter extends FragmentPagerAdapter{

final int PAGE_COUNT = 2;

/** Constructor of the class */
public MyFragmentPagerAdapter(FragmentManager fm) {
    super(fm);

}

/** This method will be invoked when a page is requested to create */
@Override
public Fragment getItem(int arg0) {
    Bundle data = new Bundle();
    switch(arg0){

        /** Android tab is selected */
        case 0:
            AndroidFragment androidFragment = new AndroidFragment();                
            data.putInt("current_page", arg0+1);
            androidFragment.setArguments(data);
            return androidFragment;

        /** Apple tab is selected */
        case 1:
            AppleFragment appleFragment = new AppleFragment();
            data.putInt("current_page", arg0+1);
            appleFragment.setArguments(data);
            return appleFragment;   
    }

    return null;
}

/** Returns the number of pages */
@Override
public int getCount() {     
    return PAGE_COUNT;
}   
}
更清楚地说,我想要一个如下所示的输出:

所选选项卡应位于中间,其他选项卡应无限滚动:

删除页数的final,并添加以下代码:

@Override
public int getCount() {     
    return PAGE_COUNT=PAGE_COUNT+1;
}

假设我们有3个选项卡,我们希望用户能够无限期地左右滑动

首先,创建一个非常大的整数

// scroll the list to a pretty large position index so it can be scroll both up and down.
private static final int A_BIG_NUMBER = 1000;
/**
 * Returns the number of pages
 */
@Override
public int getCount() {
    return 2 * A_BIG_NUMBER;
}
然后将页码设置为大整数的两倍

// scroll the list to a pretty large position index so it can be scroll both up and down.
private static final int A_BIG_NUMBER = 1000;
/**
 * Returns the number of pages
 */
@Override
public int getCount() {
    return 2 * A_BIG_NUMBER;
}
诀窍在于getItem方法,通过计算模数获得实际位置,并根据选项卡的实际位置返回片段。因此,如果有3个选项卡,位置为999,则实际位置为0;当位置为1000时,实际位置为1

 @Override
public Fragment getItem(int position) {
    int realPosition = position % numberOfTabs;

    ... 
}
初始化ViewPager时,您希望它滑动到数字较大的位置,以便用户可以来回滑动

我们可以这样做

mPager.setCurrentItem(A_BIG_NUMBER - A_BIG_NUMBER % numberOfTabs);

在这种情况下,
A_BIG_NUMBER
为1000,
A_BIG_NUMBER%numberOfTabs
为1,因此,如果ViewPager为999,则初始位置为。因此getItem(999)将返回位置0上的片段(999%3=0)

这将降低性能,因为每次滚动endsHey时,此代码都会产生更多片段。您解决了问题吗?