解析:当直接使用PagerAdapter时,必须重写destroyItem方法,FragmentPagerAdapter已经为我们写好destroyItem的实现,源码如下:
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
Fragment fragment = (Fragment) object;
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
if (DEBUG) Log.v(TAG, “Detaching item #” + getItemId(position) + “: f=” + object
- " v=" + (fragment.getView()));
mCurTransaction.detach(fragment);
if (fragment == mCurrentPrimaryItem) {
mCurrentPrimaryItem = null;
}
}
其核心代码是:
mCurTransaction.detach(fragment);
对于不再需要的fragment,FragmentPagerAdapter会选择调用事务的detach()方法来处理它,而非remove()方法。也就是说, FragmentPagerAdapter只是销毁了fragment的视图, fragment实例还保留在FragmentManager中。因此,FragmentPagerAdapter创建的fragment永远不会被销毁。
- 当页面需要刷新时,选择FragmentStatePagerAdapter;
解析:
如果使用FragmentPagerAdapter,Fragment对象一般不会被销毁的,这时需要修改ViewPager适配器中的传值,再调用以下方法刷新数据
myPagerAdapter2.notifyDataSetChanged();
但是,如果ViewPager页面比较多时,内存中会有大量的Fragment对象无法释放,浪费了内存。另外,由于ViewPager的自身特性,在内存中默认存在3个页面,其余页面会自动销毁,这样导致的情况是:ViewPager页面销毁了,但是对应的Fragment对象没有被销毁,我认为这是一个严重的内存泄漏现象。
如果使用FragmentStatePagerAdapter的话,当ViewPager页面被销毁时,Fragment对象也会被销毁,就不存在这样的内存泄漏问题。
【基本代码实现】
MyPagerAdapter2.java
public class MyPagerAdapter2 extends FragmentStatePagerAdapter {
private Context mContext;
private List myPagerFragmentList;
public MyPagerAdapter2(Context context , List list, @NonNull FragmentManager fm, int behavior) {
super(fm, behavior);
mContext = context;
myPagerFragmentList = list;
}
@Override
public int getCount() {
return myPagerFragmentList.size();
}
@NonNull
@Override
public Fragment getItem(int position) {
return myPagerFragmentList.get(position);
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
super.destroyItem(container, position, object);
}
}
MyPagerFragment.java
public class MyPagerFragment extends Fragment {
String mContent;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mContent = (String) getArguments().get(“content”);
View view = inflater.inflate(R.layout.item_base, container, false) ;
TextView textView = (TextView) view.findViewById(R.id.tv);
textView.setText(mContent);
return view;
}
}
item_base.xml
<?xml version="1.0" encoding="utf-8"?><TextView
android:id=“@+id/tv”
xmlns:android=“http://schemas.android.com/apk/res/android”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:background=“@drawable/ll_shape”
android:textColor=“#000000”
android:gravity=“center”
android:textStyle=“bold”
android:textSize=“200sp”>
调用代码:
viewpager = findViewById(R.id.viewpager);
final List list = new ArrayList<>();
文末
不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊
小编将自己6年以来的面试经验和学习笔记都整理成了一个**937页的PDF,**以及我学习进阶过程中看过的一些优质视频教程。
其实看到身边很多朋友抱怨自己的工资很低,包括笔者也是一样的,其原因是在面试过程中没有给面试官一个很好的答案。所以笔者会持续更新面试过程中遇到的问题,也希望大家和笔者一起进步,一起学习。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
*以及我学习进阶过程中看过的一些优质视频教程。
[外链图片转存中…(img-U7jNibU0-1715692957186)]
其实看到身边很多朋友抱怨自己的工资很低,包括笔者也是一样的,其原因是在面试过程中没有给面试官一个很好的答案。所以笔者会持续更新面试过程中遇到的问题,也希望大家和笔者一起进步,一起学习。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!