我有一个带有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
中移除带有FragmentManager
的Fragment
。
您必须重写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。
如果你想让我分享代码,请告诉我。