如上图界面,动态添加删除Tab和页面,请教大神们有什么好的思路?
我用viewpager+fragment的方式,每次添加或者删除页面之后,其他页面的状态都不能保存,例如我动态添加了fragmentA、fragmentB两个页面,我在fragmentA页面里面通过点击按钮A动态添加一个ALayout布局,当我把fragmentB页面删除掉之后,这个ALayout布局在fragmentA页面也会失去掉,所以请教大神们有没有更好的思路。。
ps : 附上我动态添加删除的viewpager的Adapter的代码:
public class PagerAdapter extends FragmentStatePagerAdapter {
public List<TitleViewBean> mFragments = new ArrayList<TitleViewBean>();
private ViewPager mPager;
//当前View
// private Fragment mPrimaryItem;
public MyPagerAdapter(FragmentManager fm, ViewPager vp) {
super(fm);
mPager = vp;
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position).getFragment();
}
@Override
public int getCount() {
return mFragments.size();
}
@Override
public void setPrimaryItem(ViewGroup container, int position,
Object object) {
super.setPrimaryItem(container, position, object);
// mPrimaryItem = (Fragment) object;
}
@Override
public int getItemPosition(Object object) {
// 加上这个判断之后添加功能没问题,
// 添加完页面之后,其它已添加的页面也不会刷新,
// 但是删除的时候就出现空白页面
// if (object == mPrimaryItem) {
// return POSITION_UNCHANGED;
// }
//要使Adapter的notifyDataSetChanged()方法生效,
// 除了Adapter需要继承FragmentStatePagerAdapter之外,
// 还需要这里设置返回值为POSITION_NONE
return POSITION_NONE;
}
public void addPage(TitleViewBean titleViewBean) {
mFragments.add(mFragments.size(), titleViewBean);
this.notifyDataSetChanged();
//每次添加都自动跳到最后一个页面
mPager.setCurrentItem(mFragments.size(), false);
//每次动态添加、删除页面之后重新设置viewpager的缓存数量
mPager.setOffscreenPageLimit(mFragments.size());
}
/**
* This method removes the pages from ViewPager
*/
public void removePages(int position, long tag) {
mFragments.remove(position);
mPager.removeViewAt(position);
this.notifyDataSetChanged();
//每次动态添加、删除页面之后重新设置viewpager的缓存数量
mPager.setOffscreenPageLimit(mFragments.size());
}
}
7 个解决方案
#1
望大神们指教啊
#2
第一种办法:
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
实现这2个方法, 在第一个 方法中 保存下数据 在 第二个 方法中 取出数据 设置当前状态
之所以每次没保存 是因为 你 每次都 notifyDataChange 了 所以 每次 都是重新创建
@Override
public android.support.v4.app.Fragment getItem(int position) {
return null;
}
就是这个 方法 你应该是 每次 都 new 一个item的把 .
第二种办法:
你每次调用notifyDataChange 其实 系统就会 调用getItem 然后得到fragment.
你如果 使用 已经存在的 fragment 那么 状态 就不会改变了
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
实现这2个方法, 在第一个 方法中 保存下数据 在 第二个 方法中 取出数据 设置当前状态
之所以每次没保存 是因为 你 每次都 notifyDataChange 了 所以 每次 都是重新创建
@Override
public android.support.v4.app.Fragment getItem(int position) {
return null;
}
就是这个 方法 你应该是 每次 都 new 一个item的把 .
第二种办法:
你每次调用notifyDataChange 其实 系统就会 调用getItem 然后得到fragment.
你如果 使用 已经存在的 fragment 那么 状态 就不会改变了
#3
第二种方法,我每次添加都是new的同一个fragment,然后保存在List<TitleViewBean>里面传入Adapter的,要怎么保存已经存在的fragment?
#4
请求支援。。
#5
有人么有人么
#6
代码 发我 我看看??
#7
关于“我在fragmentA页面里面通过点击按钮A动态添加一个ALayout布局,然后动态添加或者删除fragmentB页面,ALayout消失了”的问题,我自己解决了,就是在fragment的onCreateView()里面进行处理,下面贴上Fragment的代码:
private View view;
private View ALayout;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (ALayout==null) {
view = inflater.inflate(R.layout.layout_courseedit_course_title, null);
}
return view;
}
public void onClick(View view) {
addALayout();
}
/**
* 添加ALayout
*/
private void addALayout() {
if (ALayout==null) {
ALayout= LayoutInflater.from(getContext()).inflate(R.layout.layout_courseedit_showimage, null);
ImageView imgvPic;
ImageView imgvDeletePic;
ALayout.findViewById(R.id.imgv_fragment_coursetitle_deletepic).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
deteleALayout();
}
});
ALayout.findViewById(R.id.imgv_fragment_coursetitle_pic).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//查看图片
showToast("查看图片");
}
});
lnytContentLayout.addView(ALayout);
}
}
/**
* 删除ALayout
*/
private void deteleALayout() {
if (ALayout!=null) {
lnytContentLayout.removeView(ALayout);
ALayout= null;
}
}
#1
望大神们指教啊
#2
第一种办法:
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
实现这2个方法, 在第一个 方法中 保存下数据 在 第二个 方法中 取出数据 设置当前状态
之所以每次没保存 是因为 你 每次都 notifyDataChange 了 所以 每次 都是重新创建
@Override
public android.support.v4.app.Fragment getItem(int position) {
return null;
}
就是这个 方法 你应该是 每次 都 new 一个item的把 .
第二种办法:
你每次调用notifyDataChange 其实 系统就会 调用getItem 然后得到fragment.
你如果 使用 已经存在的 fragment 那么 状态 就不会改变了
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
实现这2个方法, 在第一个 方法中 保存下数据 在 第二个 方法中 取出数据 设置当前状态
之所以每次没保存 是因为 你 每次都 notifyDataChange 了 所以 每次 都是重新创建
@Override
public android.support.v4.app.Fragment getItem(int position) {
return null;
}
就是这个 方法 你应该是 每次 都 new 一个item的把 .
第二种办法:
你每次调用notifyDataChange 其实 系统就会 调用getItem 然后得到fragment.
你如果 使用 已经存在的 fragment 那么 状态 就不会改变了
#3
第一种办法:
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
实现这2个方法, 在第一个 方法中 保存下数据 在 第二个 方法中 取出数据 设置当前状态
之所以每次没保存 是因为 你 每次都 notifyDataChange 了 所以 每次 都是重新创建
@Override
public android.support.v4.app.Fragment getItem(int position) {
return null;
}
就是这个 方法 你应该是 每次 都 new 一个item的把 .
第二种办法:
你每次调用notifyDataChange 其实 系统就会 调用getItem 然后得到fragment.
你如果 使用 已经存在的 fragment 那么 状态 就不会改变了
第二种方法,我每次添加都是new的同一个fragment,然后保存在List<TitleViewBean>里面传入Adapter的,要怎么保存已经存在的fragment?
#4
请求支援。。
#5
有人么有人么
#6
有人么有人么
代码 发我 我看看??
#7
有人么有人么
代码 发我 我看看??
关于“我在fragmentA页面里面通过点击按钮A动态添加一个ALayout布局,然后动态添加或者删除fragmentB页面,ALayout消失了”的问题,我自己解决了,就是在fragment的onCreateView()里面进行处理,下面贴上Fragment的代码:
private View view;
private View ALayout;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (ALayout==null) {
view = inflater.inflate(R.layout.layout_courseedit_course_title, null);
}
return view;
}
public void onClick(View view) {
addALayout();
}
/**
* 添加ALayout
*/
private void addALayout() {
if (ALayout==null) {
ALayout= LayoutInflater.from(getContext()).inflate(R.layout.layout_courseedit_showimage, null);
ImageView imgvPic;
ImageView imgvDeletePic;
ALayout.findViewById(R.id.imgv_fragment_coursetitle_deletepic).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
deteleALayout();
}
});
ALayout.findViewById(R.id.imgv_fragment_coursetitle_pic).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//查看图片
showToast("查看图片");
}
});
lnytContentLayout.addView(ALayout);
}
}
/**
* 删除ALayout
*/
private void deteleALayout() {
if (ALayout!=null) {
lnytContentLayout.removeView(ALayout);
ALayout= null;
}
}