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)
})