Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.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
Android 循环一个碎片页雷达_Android_Android Viewpager - Fatal编程技术网

Android 循环一个碎片页雷达

Android 循环一个碎片页雷达,android,android-viewpager,Android,Android Viewpager,我有一个FragmentPagerAdapter可以正常工作,但我想知道的是,如果FragmentPagerAdapter在最后一个视图中,我如何让它返回到第一个视图并继续正常工作 这是我正在使用的示例代码 public class FragmentPager extends FragmentActivity { MyAdapter mAdapter; ViewPager mPager; static final int NUM_ITEMS = 5; @Override protected v

我有一个
FragmentPagerAdapter
可以正常工作,但我想知道的是,如果
FragmentPagerAdapter
在最后一个视图中,我如何让它返回到第一个视图并继续正常工作

这是我正在使用的示例代码

public class FragmentPager extends FragmentActivity {
MyAdapter mAdapter;
ViewPager mPager;
static final int NUM_ITEMS = 5;

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

    mAdapter = new MyAdapter(getSupportFragmentManager());

    mPager = (ViewPager)findViewById(R.id.pager);
    mPager.setAdapter(mAdapter);
}

public static class MyAdapter extends FragmentPagerAdapter {
    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

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

    @Override
    public Fragment getItem(int position) {
        return MyFragment.newInstance(position);
    }
}

public static class MyFragment extends ListFragment{
    int mNum;

    /**
     * Create a new instance of CountingFragment, providing "num"
     * as an argument.
     */
    static MyFragment newInstance(int num) {
        MyFragment f = new MyFragment();

        // Supply num input as an argument.
        Bundle args = new Bundle();
        args.putInt("num", num);
        f.setArguments(args);

        return f;
    }

    /**
     * When creating, retrieve this instance's number from its arguments.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mNum = getArguments() != null ? getArguments().getInt("num") : 1;
    }

    /**
     * The Fragment's UI is just a simple text view showing its
     * instance number.
     */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_pager_list, container, false);
        View tv = v.findViewById(R.id.text);
        ((TextView)tv).setText("Fragment #" + mNum);
        return v;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setListAdapter(new ArrayAdapter<String>(getActivity(),
                android.R.layout.simple_list_item_1, new String[] {"test1","test2","test3","test4","Test5"}));
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        Log.i("FragmentList", "Item clicked: " + id);
    }
}

}
公共类碎片寻呼机扩展碎片活动{
MyAdapter mAdapter;
可视寻呼机;
静态最终整数项目=5;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mAdapter=新的MyAdapter(getSupportFragmentManager());
mPager=(ViewPager)findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
}
公共静态类MyAdapter扩展了FragmentPagerAdapter{
公共MyAdapter(FragmentManager fm){
超级(fm);
}
@凌驾
public int getCount(){
返回NUM_项;
}
@凌驾
公共片段getItem(int位置){
返回MyFragment.newInstance(位置);
}
}
公共静态类MyFragment扩展了ListFragment{
国际货币基金组织;
/**
*创建CountingFragment的新实例,提供“num”
*作为论据。
*/
静态MyFragment newInstance(int num){
MyFragment f=新的MyFragment();
//提供num输入作为参数。
Bundle args=新Bundle();
args.putInt(“num”,num);
f、 设置参数(args);
返回f;
}
/**
*创建时,从实例的参数中检索该实例的编号。
*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
mNum=getArguments()!=null?getArguments().getInt(“num”):1;
}
/**
*片段的UI只是一个简单的文本视图,显示其
*实例号。
*/
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图v=充气机。充气(R.layout.fragment\u pager\u list,container,false);
查看电视=v.findviewbyd(R.id.text);
(文本视图)tv.setText(“片段”+mNum);
返回v;
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
setListAdapter(新的ArrayAdapter(getActivity()),
android.R.layout.simple_list_item_1,新字符串[]{“test1”、“test2”、“test3”、“test4”、“Test5”});
}
@凌驾
public void onListItemClick(列表视图l、视图v、整数位置、长id){
Log.i(“碎片列表”,“单击的项目:”+id);
}
}
}
基本上,当它结束时,我如何让它显示第一个片段,就像它显示任何其他片段一样

A->B

B->C
C->A
和向后的
A->C
C->B
B->A
这是一个相当不错的技巧,但对我来说效果相当不错:

@Override
public int getCount() {
    return NUM_ITEMS * 1000;
}
这将使您的页面“循环”1000倍 不要忘记对getItem使用%操作,就像这样

@Override
public Fragment getItem(int position) {
    position = position % 1000;
    return MyFragment.newInstance(position);
}

这是我的解决方案,我有“n”个屏幕(本例中为5个),由于我想回到列表末尾的第一个屏幕,我“添加另一个屏幕”,它只是最后一个屏幕的精确副本,并且也反向执行此操作。基本上,我现在有“n”个屏幕+2(在本例中是7个)。屏幕设置如下:
复制C
A
B
C
复制A
,然后我设置了一个手势监听器来监视某些页面上的滑动

如果在列表末尾(“A的副本”),我检测到向左滑动了一定数量的像素,我将移动到页面
A
,并继续以正常的页面旋转方式向后滑动

相反方向的刷卡也是如此

问题

当从一个结束页面移动以模拟循环时,它确实会变得有点慢,因为
ViewPager
会在当前页面前后加载页面,但由于您位于页面列表的末尾或开头,它不会像通常那样加载下一页,因为技术上没有下一页。只有当每个列表行都有复杂的自定义视图时,才会发生这种情况

您不能将其与动画一起用于页面滚动,因为当您从复制的页面移动到实际页面(即从a到a的副本)时,它看起来不会无缝,并且会设置动画

而且有时它似乎会卡在页面的末尾,我不知道为什么

这是我在android开发者网站上基于viewpager示例的完整演示应用程序

public class FragmentPager extends FragmentActivity{
MyAdapter mAdapter;
public static ViewPager mPager;
static int currentPage = 1;
static final int NUM_ITEMS = 7;
public static View vContainer;
float dxInitial=0;

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

    mAdapter = new MyAdapter(getSupportFragmentManager());

    mPager = (ViewPager)findViewById(R.id.pager);
    mPager.setAdapter(mAdapter);
    mPager.setCurrentItem(1,false);

    mPager.setOnTouchListener(new OnTouchListener(){

        @Override
        public boolean onTouch(View v, MotionEvent event) {


            if(event.getAction() == MotionEvent.ACTION_DOWN){
                dxInitial=event.getX();
                Log.d("INITIAL X", String.valueOf(dxInitial));
            }else if(event.getAction() == MotionEvent.ACTION_MOVE){
                if(event.getX() - dxInitial > 100 && currentPage==1){
                    mPager.setCurrentItem(6,false);
                }else if(dxInitial - event.getX() > 100 && currentPage==5){
                    mPager.setCurrentItem(0,false);
                }else if(dxInitial - event.getX() > 50 && currentPage==6){
                    mPager.setCurrentItem(1,false);
                }else if(event.getX() - dxInitial > 50 && currentPage==0){
                    mPager.setCurrentItem(5,false);
                }
            }

            /*if(Math.abs(dx) > Math.abs(dy)) {
                if(dx>75){ directiion = "right";
                }else if{
                    direction = "left";
                }
            } else {
                if(dy>0) direction = "down";
                else direction = "up";
            }*/

            return false;
        }

    });
    mPager.setOnPageChangeListener(new OnPageChangeListener(){

        @Override
        public void onPageScrollStateChanged(int state) {
            // TODO Auto-generated method stub
            if(state == ViewPager.SCROLL_STATE_IDLE){

            }
        }

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int arg0) {
            currentPage=arg0;

        }

    });
}

public static class MyAdapter extends FragmentPagerAdapter{
    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

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

    @Override
    public Fragment getItem(int position) {
        return MyFragment.newInstance(position);
    }

    @Override
    public Object instantiateItem(View container, int position) {
        vContainer=container;
        return super.instantiateItem(container, position);

    }
}

public static class MyFragment extends ListFragment{
    int mNum;

    /**
     * Create a new instance of CountingFragment, providing "num"
     * as an argument.
     */
    static MyFragment newInstance(int num) {
        MyFragment f = new MyFragment();

        // Supply num input as an argument.
        Bundle args = new Bundle();
        args.putInt("num", num);
        f.setArguments(args);

        return f;
    }

    /**
     * When creating, retrieve this instance's number from its arguments.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mNum = getArguments() != null ? getArguments().getInt("num") : 1;
    }

    /**
     * The Fragment's UI is just a simple text view showing its
     * instance number.
     */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_pager_list, container, false);
        View tv = v.findViewById(R.id.text);
        if(mNum == 6){
            mNum=1;
        }else if(mNum==7){
            mNum=5;
        }else if(mNum==0){
            mNum=5;
        }
        ((TextView)tv).setText("Fragment #" + mNum);
        return v;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setListAdapter(new ArrayAdapter<String>(getActivity(),
                android.R.layout.simple_list_item_1, new String[] {"test1","test2","test3","test4","Test5"}));
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        Log.i("FragmentList", "Item clicked: " + id);
    }
}

}
公共类碎片寻呼机扩展碎片活动{
MyAdapter mAdapter;
公共静态寻呼机;
静态int currentPage=1;
静态最终整数项目=7;
公共静态视图vContainer;
浮动dxInitial=0;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mAdapter=新的MyAdapter(getSupportFragmentManager());
mPager=(ViewPager)findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
mPager.setCurrentItem(1,false);
setOnTouchListener(新的OnTouchListener(){
@凌驾
公共布尔onTouch(视图v,运动事件){
if(event.getAction()==MotionEvent.ACTION\u向下){
dxInitial=event.getX();
Log.d(“初始X”,String.valueOf(dxInitial));
}else if(event.getAction()==MotionEvent.ACTION\u MOVE){
如果(event.getX()-dxInitial>100&¤tPage==1){
mPager.setCurrentItem(6,错误);
}else if(dxInitial-event.getX()>100&¤tPage==5){
mPager.setCurrentItem(0,false);
}else if(dxInitial-event.getX()>50&¤tPage==6){
mPager.setCurrentItem(1,false);
}
inner class UserProfileSlidePagerAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) {

    var profileToJumpTo: Int? = null

    override fun getItemCount(): Int {
        if (userIdsForLocalUsers.size > 0) {
            return userIdsForLocalUsers.size + 2
        }
        return userIdsForLocalUsers.size
    }

    override fun createFragment(position: Int): Fragment {
        var positionToUse = position - 1
        if (position > userIdsForLocalUsers.size)
        {
            positionToUse = 0
        }
        if (positionToUse < 0)
        {
            positionToUse = userIdsForLocalUsers.size - 1
        }
        val userId = userIdsForLocalUsers[positionToUse]
        this@ProfileViewModel.availableUserProfilesHash[userId].let {userProfile ->
            return CarouselUserProfileFragment.newInstance(userProfile!!)
        }
    }
}
this.profiles_view_pager.registerOnPageChangeCallback(object: ViewPager2.OnPageChangeCallback() {
    override fun onPageScrollStateChanged(state: Int) {
        if (state == ViewPager2.SCROLL_STATE_IDLE) {
            val adapter = this@CarouselFragment.profiles_view_pager.adapter as ProfileViewModel.UserProfileSlidePagerAdapter
            val profileToJumpTo = adapter.profileToJumpTo
            profileToJumpTo?.let {
                this@CarouselFragment.profiles_view_pager.setCurrentItem(profileToJumpTo, false)
                adapter.profileToJumpTo = null
            }
        }
        super.onPageScrollStateChanged(state)
    }
    override fun onPageSelected(position: Int) {
        val adapter = this@CarouselFragment.profiles_view_pager.adapter as ProfileViewModel.UserProfileSlidePagerAdapter
        adapter.itemCount.let { itemCount ->
            if (position == 0) {
                adapter.profileToJumpTo = itemCount - 2
            }
            if (position == itemCount - 1) {
                adapter.profileToJumpTo = 1
            }
        }
        super.onPageSelected(position)
    }
})
this.profileViewModel.loadUserProfilesResult.observe(viewLifecycleOwner, Observer {     
    this.profiles_view_pager.setCurrentItem(1, false)
 })