if (position == -1) {
return;
}
//从Transaction移除旧的Fragment
removeFragmentInternal(oldFragment);
//替换List中对应的Fragment
mFragmentList.set(position, newFragment);
//刷新Adapter
notifyItemChanged();
}
/**
-
将指定位置的Fragment替换/更新为新的Fragment,同{@link #replaceFragment(BaseFragment oldFragment, BaseFragment newFragment)}
-
@param position 旧Fragment的位置
-
@param newFragment 新Fragment
*/
public void replaceFragment(int position, BaseFragment newFragment) {
BaseFragment oldFragment = mFragmentList.get(position);
removeFragmentInternal(oldFragment);
mFragmentList.set(position, newFragment);
notifyItemChanged();
}
/**
-
移除指定的Fragment
-
@param fragment 目标Fragment
*/
public void removeFragment(BaseFragment fragment) {
//先从List中移除
mFragmentList.remove(fragment);
//然后从Transaction移除
removeFragmentInternal(fragment);
//最后刷新Adapter
notifyItemChanged();
}
/**
-
移除指定位置的Fragment,同 {@link #removeFragment(BaseFragment fragment)}
-
@param position
*/
public void removeFragment(int position) {
BaseFragment fragment = mFragmentList.get(position);
//然后从List中移除
mFragmentList.remove(fragment);
//先从Transaction移除
removeFragmentInternal(fragment);
//最后刷新Adapter
notifyItemChanged();
}
/**
-
添加Fragment
-
@param fragment 目标Fragment
*/
public void addFragment(BaseFragment fragment) {
mFragmentList.add(fragment);
notifyItemChanged();
}
/**
-
在指定位置插入一个Fragment
-
@param position 插入位置
-
@param fragment 目标Fragment
*/
public void insertFragment(int position, BaseFragment fragment) {
mFragmentList.add(position, fragment);
notifyItemChanged();
}
private void notifyItemChanged() {
//刷新之前重新收集位置信息
setFragmentPositionMapForUpdate();
notifyDataSetChanged();
setFragmentPositionMap();
}
/**
-
从Transaction移除Fragment
-
@param fragment 目标Fragment
*/
private void removeFragmentInternal(BaseFragment fragment) {
FragmentTransaction transaction = mFragmentManager.beginTransaction();
transaction.remove(fragment);
transaction.commitNow();
}
/**
- 此方法不用position做返回值即可破解fragment tag异常的错误
*/
@Override
public long getItemId(int position) {
// 获取当前数据的hashCode,其实这里不用hashCode用自定义的可以关联当前Item对象的唯一值也可以,只要不是直接返回position
return mFragmentList.get(position).hashCode();
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public List getFragments() {
return mFragmentList;
}
}
好了,现在这个类可以用来实现Fragment列表中的Fragment替换、删除、添加等操作了,并且可以实时刷新adapter, 你可以试验一下。
测试代码:
Activity代码
public class TestActivity extends FragmentActivity implements View.OnClickListener {
List mFragmentList;
ViewPager mViewPager;
public BaseFragmentPagerAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
mViewPager = findViewById(R.id.vp);
findViewById(R.id.btn_change).setOnClickListener(this);
mFragmentList = new ArrayList<>();
mFragmentList.add(getFg(“AAA”));
mFragmentList.add(getFg(“BBB”));
mFragmentList.add(getFg(“CCC”));
mFragmentList.add(getFg(“DDD”));
mAdapter = new BaseFragmentPagerAdapter(getSupportFragmentManager(), mFragmentList);
mViewPager.setAdapter(mAdapter);
}
private TestFragment getFg(String a){
TestFragment fragment = new TestFragment();
fragment.setTest(a);
return fragment;
}
@Override
public void onClick(View view) {
TestFragment eee = getFg(“EEE”);
//新增
mAdapter.addFragment(eee);
//插入
mAdapter.insertFragment(1, eee);
//删除
mAdapter.removeFragment(1);
//删除
mAdapter.removeFragment(mFragmentList.get(1));
//替换
mAdapter.replaceFragment(1, eee);
//替换
mAdapter.replaceFragment(mFragmentList.get(0), eee);
}
}
用到的TestFragment:
public class TestFragment extends Fragment {
private final static String TAG = TestFragment.class.getSimpleName();
private String test;
public View mContentView;
public void setTest(String test) {
this.test = test;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(TAG, "onCreate: test = "+test);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mContentView = inflater.inflate(R.layout.layout_fg, null);
Log.e(TAG, "onCreateView: test = "+test);
return mContentView;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
Log.e(TAG, "onViewCreated: test = "+test);
TextView testText = mContentView.findViewById(R.id.tv_test);
testText.setText(test);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.e(TAG, "onActivityCreated: test = "+test);
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
碰到天花板技术停滞不前!**
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-8GQfB1cL-1710916840485)]
[外链图片转存中…(img-58F1crxx-1710916840486)]
[外链图片转存中…(img-Oxedhb4h-1710916840487)]
[外链图片转存中…(img-kCI8H1qS-1710916840487)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-LIC0tC9L-1710916840488)]