viewpager+fragment+Tab动态添加删除,求大神指教有什么好思路

时间:2021-08-30 08:56:08
viewpager+fragment+Tab动态添加删除,求大神指教有什么好思路

如上图界面,动态添加删除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  那么 状态 就不会改变了

#3


引用 2 楼 qq840727854 的回复:
第一种办法:
@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


引用 5 楼 zhumj_zhumj 的回复:
有人么有人么


代码 发我 我看看??

#7


引用 6 楼 qq840727854 的回复:
Quote: 引用 5 楼 zhumj_zhumj 的回复:

有人么有人么


代码 发我 我看看??


关于“我在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  那么 状态 就不会改变了

#3


引用 2 楼 qq840727854 的回复:
第一种办法:
@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


引用 5 楼 zhumj_zhumj 的回复:
有人么有人么


代码 发我 我看看??

#7


引用 6 楼 qq840727854 的回复:
Quote: 引用 5 楼 zhumj_zhumj 的回复:

有人么有人么


代码 发我 我看看??


关于“我在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;
        }
    }