android视图寻呼机与碎片使用FragmentPageAdapter动态添加,删除



我有一个带有tabhost和viewpager的应用程序。我有一个标签,碎片是固定的。我必须添加选项卡,片段动态点击单选按钮,从第一个片段开始在单选组中。

MyPagerAdapter类:

import java.util.ArrayList;
import java.util.List;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;
public class MyViewPageAdapter extends FragmentPagerAdapter {
    private List<Fragment> fragments = new ArrayList<Fragment>();
    FragmentManager fm;
    public List<Fragment> getFragments() {
        return fragments;
    }
    public void setFragments(List<Fragment> fragments) {
        this.fragments = fragments;
    }
    public MyViewPageAdapter(FragmentManager fm, List<Fragment> fragments) {
        super(fm);
        this.fm = fm;
        this.fragments = fragments;
    }
    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }
    @Override
    public int getCount() {
        return fragments.size();
    }
    public void addFragment(Fragment fragment) {
        this.fragments.add(fragment);
        notifyDataSetChanged();
    }
    public void removeFragments() {
        try {
            List<Fragment> newList = new ArrayList<Fragment>();
            Fragment general = fragments.get(0);
            newList.add(general);           
            this.fragments.clear();
            this.fragments = new ArrayList<Fragment>();
            this.fragments = newList;
            notifyDataSetChanged();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void removeItemFromFrament(ViewGroup container, int position, Object object) {
        try {
            try {
                container.removeViewAt(position);
                ((ViewPager) container).setCurrentItem(position - 1);               
            } catch (Exception e) {
                e.printStackTrace();
            }
            notifyDataSetChanged();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

MyPagerFragment类:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class MyViewPageFragment extends Fragment {
    private static View mView;
    public static final MyViewPageFragment newInstance(int layoutId) {
        MyViewPageFragment f = new MyViewPageFragment();
        Bundle b = new Bundle();
        b.putInt("layout", layoutId);
        f.setArguments(b);
        return f;
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        int layout = getArguments().getInt("layout");
        try {
            mView = inflater.inflate(layout, container, false);
        } catch (Exception e) {
        }
        return mView;
    }
}

我正在尝试将片段添加到适配器中,如下所示:

Fragment fragment = MyViewPageFragment.newInstance(R.layout.tab_content_layout);
((MyViewPageAdapter) mViewPager.getAdapter()).addFragment(fragment);

我的问题:第一次,页面被正确添加,在删除所有视图(第一个片段除外)并尝试添加另一组选项卡后,片段视图不可见,并且getSupportFragmentmanager.getFragments().size()不正确。

我试图用片段管理器从viewpager中删除视图

FragmentManager manager = ((Fragment) object).getFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove((Fragment) object);
trans.commit();

添加选项卡后,页面上的片段滚动getSupportFragmentManager()。getFragments.get(arg0)返回null。

注意:我必须维护第一个片段的状态,所以FragmentStatePagerAdapter和getItemPosition返回POSITION_NONE是不可接受的。

与您没有在ListAdapter中的ListView上专门调用removeView()来移除项目相同,您也没有直接从FragmentPagerAdapter中移除带有FragmentManagerFragment

您必须重写getItemPosition(),但您必须提供比始终返回POSITION_NONE更智能的实现。

如果您的第一个片段从未更改,那么当该片段传递给getItemPosition() 时,始终返回POSITION_UNCHANGED

把它想象成你和ViewPager/FragmentPagerAdapter之间的对话。这里有一个例子:

你:"我需要改变周围的碎片。"(呼叫notifyDataSetChanged

适配器:"注意,我现在要改变周围的一切。"(回调startUpdate

适配器:"你想要多少个选项卡?"(回调getCount()

你:三个。(返回'3')

适配器:"好吧,你想让我怎么处理第一个?"(回叫getItemPosition

你:"我想把那个放在原处。"(返回POSITION_UNCHANGED

适配器:"太好了,第二个怎么样?"(回叫getItemPosition

你:"我想把它移到第三个标签页。"(返回'2')

适配器:"好吧,第三个怎么样?"(回叫getItemPosition

你:"我想彻底摆脱那个。"(返回POSITION_NONE

适配器:"好的,我有第二个选项卡的空间,你想让我使用什么片段?"(回调getItem

你:"这个。"(返回位置==1的碎片)

适配器:"我已经完成了所有更改,kthxbye。"(回调finishUpdate

我可能没有完全正确的通话顺序,但基本的想法是存在的。

如果你需要维护被踢出的碎片的状态,你可以覆盖getItem()destroyItem()来帮助你:

private FragmentManager mFragmentManager;
public MyPagerAdapter(FragmentManager fm) {
    super(fm);
    mFragmentManager = fm;
}
@Override
public Fragment getItem(int position) {
    // figure out which fragment you want at this position
    Fragment fragment = new MyFragment();
    // retrieve your savedState from wherever you put it
    fragment.setInitialSavedState(savedState);
    return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    Fragment fragment = (Fragment) object;
    Fragment.SavedState savedState = mFragmentManager.saveFragmentInstanceState(fragment)
    // save your fragment state somewhere here
    super.destroyItem(container, position, object);
}

您的片段需要实现saveState()restoreState()才能工作。

我用FragmentStatePagerAdapter尝试了与您类似的要求,它运行良好。也许它能帮助你。

添加新片段:

SIZE = SIZE +1;
adapter.instantiateItem(viewPager, SIZE-1);
adapter.notifyDataSetChanged();

在getItem()中,对于"位置",创建并返回新片段(我在这里使用了switch语句)

更新getCount()方法以返回新的SIZE。

如果你想让我分享代码,请告诉我。

最新更新