我正在尝试做一些非常基本的事情,但似乎无法让它发挥作用。
我有 aViewPager
并且正在使用 aFragmentPagerAdapter
用片段填充它。我总是有 3 个片段(称它们为 A、B、C),片段 CI 上有一个简单的ListView
. 每当用户单击该 ListView 上的一个项目时,我想向 ViewPager 添加一个新片段(片段 D),它将显示与该列表项相关的详细信息。
如果用户返回片段 C,他们可以单击另一个列表项,片段 D 的内容应该更新为其他详细信息。
这是 PageAdapter 的代码:
public class TopPagerAdapter extends FragmentPagerAdapter {
private final ArrayList<Fragment> fragments = new ArrayList<Fragment>();
public TopPagerAdapter(FragmentManager fm) {
super(fm);
fragments.add(0, new FragmentA());
fragments.add(1, new FragmentB());
fragments.add(2, new FragmentC());
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
return null;
}
public void addFragmentD(FragmentD frag) {
fragments.add(3, frag);
notifyDataSetChanged();
}
public void removeFragmentD() {
fragments.remove(3);
notifyDataSetChanged();
}
}
这就是它的使用方式(当用户单击片段 C 中的列表项时):
rowView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
FragmentD frag = new FragmentD();
Bundle args = new Bundle();
args.putString("name", mName.getText().toString());
frag.setArguments(args);
adapter.addFragmentD(frag);
}
});
这是 Fragment D 的实际代码(它所做的只是获取传递给它的包并显示它):
public class FragmentD extends Fragment {
private Context mContext;
private TextView mName;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
this.mContext = activity;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_d, container, false);
mName= (TextView) view.findViewById(R.id.name);
String name = (String) getArguments().get("name");
mName.setText(name);
return view;
}
}
最终结果是 FragmentD 被正确添加,它显示了通过 Bundle 传递给它的正确信息,但它只在第一次工作。如果我返回 FragmentC 并单击另一个列表项,则会显示相同的 FragmentD,即使我正在创建 FragmentD 的新实例,它的onCreateView
方法也不会被调用。就好像它留在记忆中,永远不会被删除。
任何想法如何使这项工作?谢谢。