FragmentPagerAdaper 實現頁面切換 和 FragmentStatePagerAdapter 實現頁面切換,區別,優缺點,實際開發使用哪種
阿新 • • 發佈:2018-11-06
- Fragment 繼承 v4 包
- MyFragmentViewPagerAdapter 這個介面卡並沒有實現頁面銷燬方法,因此,頁面較大,較多,記憶體壓力會比較大
- 實際開發推薦使用 FragmentStatePagerAdapter 此介面卡
示例效果:
FragmentPagerAdaper 實現頁面切換
Fragment1.java (除此之外還有3個一樣的)
public class Fragment1 extends Fragment { @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_layout1,container,false); } }
fragment_layout1.xml(除此之外還有3個一樣的)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="Fragment1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.view.PagerTabStrip android:id="@+id/pagerTabStrip" android:layout_width="match_parent" android:layout_height="wrap_content"></android.support.v4.view.PagerTabStrip> </android.support.v4.view.ViewPager> </LinearLayout>
MyFragmentViewPagerAdapter.java
public class MyFragmentViewPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> datas;
private List<String> titles;
public MyFragmentViewPagerAdapter(FragmentManager fm, List<Fragment> datas, List<String> titles) {
super(fm);
this.datas = datas;
this.titles = titles;
}
@Override
public Fragment getItem(int i) {
return datas.get(i);
}
@Override
public int getCount() {
return datas.size();
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return titles.get(position);
}
// 移除檢視 未實現
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
private ViewPager viewPager;
private List<Fragment> datas;
private List<String> titles;
private MyFragmentViewPagerAdapter myFragmentViewPagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = findViewById(R.id.viewPager);
init();
myFragmentViewPagerAdapter = new MyFragmentViewPagerAdapter(getSupportFragmentManager(),datas
,titles);
viewPager.setAdapter(myFragmentViewPagerAdapter);
}
private void init() {
datas = new ArrayList<>();
titles = new ArrayList<>();
for (int i = 0; i < 3; i++) {
titles.add("標題:"+i);
}
datas.add(new Fragment1());
datas.add(new Fragment2());
datas.add(new Fragment3());
datas.add(new Fragment1());
titles.add("標題:"+3);
}
}
FragmentStatePagerAdapter 實現頁面切換
MyFragmentViewPagerAdapter 稍作更改
public class MyFragmentViewPagerAdapter extends FragmentStatePagerAdapter {
private List<Fragment> datas;
private List<String> titles;
public MyFragmentViewPagerAdapter(FragmentManager fm, List<Fragment> datas, List<String> titles) {
super(fm);
this.datas = datas;
this.titles = titles;
}
@Override
public Fragment getItem(int i) {
return datas.get(i);
}
@Override
public int getCount() {
return datas.size();
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return titles.get(position);
}
// 相比較對 FragmentPagerAdaper 多新增下面兩個方法
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
return super.instantiateItem(container, position);
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
super.destroyItem(container, position, object);
}
}
MainActivity.java 新增監聽器
public class MainActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener {
private ViewPager viewPager;
private List<Fragment> datas;
private List<String> titles;
private MyFragmentViewPagerAdapter myFragmentViewPagerAdapter;
private String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = findViewById(R.id.viewPager);
init();
myFragmentViewPagerAdapter = new MyFragmentViewPagerAdapter(getSupportFragmentManager(), datas
, titles);
viewPager.setAdapter(myFragmentViewPagerAdapter);
viewPager.addOnPageChangeListener(this);
}
private void init() {
datas = new ArrayList<>();
titles = new ArrayList<>();
for (int i = 0; i < 3; i++) {
titles.add("標題:" + i);
}
datas.add(new Fragment1());
datas.add(new Fragment2());
datas.add(new Fragment3());
datas.add(new Fragment1());
titles.add("標題:" + 3);
}
// 實現以下 3 個方法
@Override
public void onPageScrolled(int i, float v, int i1) {
Log.d(TAG, "onPageScrolled(int i, float v, int i1)");
}
@Override
public void onPageSelected(int i) {
Log.d(TAG, "onPageSelected(int i)");
}
@Override
public void onPageScrollStateChanged(int i) {
Log.d(TAG, "onPageScrollStateChanged(int i)");
}
}