Android-ViewPager(翻页控件)

ViewPager(翻页控件)

ViewPager是android扩展包v4包中的类,这个类可以让用户左右切换当前的view

1.ViewPager类直接继承了ViewGroup类,所有它是一个容器类,可以在其中添加其他的view类。

2.ViewPager类需要一个PagerAdapter适配器类给它提供数据。

3.ViewPager经常和Fragment一起使用,并且提供了专门的FragmentPagerAdapter和FragmentStatePagerAdapter类供Fragment中的ViewPager使用。

ViewPager经常用来连接Fragment,它很方便管理每个页面的生命周期,使用ViewPager管理Fragment是标准的适配器实现。最常用的实现一般有FragmentPagerAdapter和FragmentStatePagerAdapte

实现一个最基本的PagerAdapter,《必须实现四个方法》,在代码里有注释
public class AdapterViewpager extends PagerAdapter {
private List mViewList;

public AdapterViewpager(List<View> mViewList) {
    this.mViewList = mViewList;
}

@Override
public int getCount() {//必须实现
    return mViewList.size();
}

@Override
public boolean isViewFromObject(View view, Object object) {//必须实现
    return view == object;
}

@Override
public Object instantiateItem(ViewGroup container, int position) {//必须实现,实例化
    container.addView(mViewList.get(position));
    return mViewList.get(position);
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {//必须实现,销毁
    container.removeView(mViewList.get(position));
}

}

实现一个最基本的FragmentPagerAdapter
public class AdapterFragment extends FragmentPagerAdapter {
private List mFragments;

public AdapterFragment(FragmentManager fm, List<Fragment> mFragments) {
    super(fm);
    this.mFragments = mFragments;
}

@Override
public Fragment getItem(int position) {//必须实现
    return mFragments.get(position);
}

@Override
public int getCount() {//必须实现
    return mFragments.size();
}

@Override
public CharSequence getPageTitle(int position) {//选择性实现
    return mFragments.get(position).getClass().getSimpleName();
}

}

两个适配器的源码

FragmentStatePagerAdapter

@Override
public Object instantiateItem(ViewGroup container, int position) {
// If we already have this item instantiated, there is nothing
// to do. This can happen when we are restoring the entire pager
// from its saved state, where the fragment manager has already
// taken care of restoring the fragments we previously had instantiated.
if (mFragments.size() > position) {
Fragment f = mFragments.get(position);//fragment被释放后这里得到的null值
if (f != null) {
return f;
}
}

  if (mCurTransaction == null) {
      mCurTransaction = mFragmentManager.beginTransaction();
  }

  Fragment fragment = getItem(position);//fragment被释放后或者是初次进入页面拿到新的Fragment实例
  if (DEBUG) Log.v(TAG, "Adding item #" + position + ": f=" + fragment);
  if (mSavedState.size() > position) {
      Fragment.SavedState fss = mSavedState.get(position);
      if (fss != null) {
          fragment.setInitialSavedState(fss);
      }
  }
  while (mFragments.size() <= position) {
      mFragments.add(null);
  }
  fragment.setMenuVisibility(false);
  fragment.setUserVisibleHint(false);
  mFragments.set(position, fragment);
  mCurTransaction.add(container.getId(), fragment);//新的Fragment实例 是add上去的

  return fragment;

}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
Fragment fragment = (Fragment) object;

  if (mCurTransaction == null) {
      mCurTransaction = mFragmentManager.beginTransaction();
  }
  if (DEBUG) Log.v(TAG, "Removing item #" + position + ": f=" + object
          + " v=" + ((Fragment)object).getView());
  while (mSavedState.size() <= position) {
      mSavedState.add(null);
  }
  mSavedState.set(position, fragment.isAdded()
          ? mFragmentManager.saveFragmentInstanceState(fragment) : null);
  mFragments.set(position, null);//真正释放了fragment实例

  mCurTransaction.remove(fragment);

}

FragmentPagerAdapter

@Override
public Object instantiateItem(ViewGroup container, int position) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}

  final long itemId = getItemId(position);

  // Do we already have this fragment?
  String name = makeFragmentName(container.getId(), itemId);
  Fragment fragment = mFragmentManager.findFragmentByTag(name);
  if (fragment != null) {
      if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
      mCurTransaction.attach(fragment);//因为fragment实例没有被真正释放,所以可以直接atta
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以使用 Android 中的 ViewPager 来实现左右滑动翻页效果。ViewPager 是一个可滑动的控件,可以在多个页面之间进行切换。以下是实现步骤: 1. 在 layout 文件中添加 ViewPager 控件: ```xml <androidx.viewpager.widget.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 2. 创建适配器类,继承自 FragmentPagerAdapter 或 FragmentStatePagerAdapter,用于管理 ViewPager 中的页面: ```java public class MyPagerAdapter extends FragmentPagerAdapter { private List<Fragment> mFragments; public MyPagerAdapter(FragmentManager fm, List<Fragment> fragments) { super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); mFragments = fragments; } @Override public Fragment getItem(int position) { return mFragments.get(position); } @Override public int getCount() { return mFragments.size(); } } ``` 3. 创建多个 Fragment 作为 ViewPager 中的页面: ```java public class MyFragment extends Fragment { @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_my, container, false); // TODO: 初始化布局 return view; } } ``` 4. 将多个 Fragment 添加到适配器中: ```java List<Fragment> fragments = new ArrayList<>(); fragments.add(new MyFragment()); fragments.add(new MyFragment()); fragments.add(new MyFragment()); MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager(), fragments); viewPager.setAdapter(adapter); ``` 5. (可选)设置页面切换动画: ```java viewPager.setPageTransformer(true, new ZoomOutPageTransformer()); ``` 以上就是实现左右滑动翻页效果的基本步骤。如果需要实现点击滑块左右滑动翻页效果,可以在布局文件中添加 TabLayout 控件,并将其与 ViewPager 绑定: ```xml <com.google.android.material.tabs.TabLayout android:id="@+id/tabLayout" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabGravity="fill" app:tabMode="fixed" /> <androidx.viewpager.widget.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> <com.google.android.material.tabs.TabLayoutMediator android:id="@+id/tabLayoutMediator" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabGravity="fill" app:tabMode="fixed" app:viewPager="@id/viewPager" /> ``` 这样就可以实现点击滑块左右滑动翻页效果了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值