0

私はかなり基本的なことをしようとしていますが、うまくいかないようです。

私は a を持っており、 aViewPagerを使用しFragmentPagerAdapterてフラグメントを入力しています。私は常に3つのフラグメント(A、B、Cと呼びます)を持ち、フラグメントCIには単純なListView. ユーザーがその ListView の項目をクリックするたびに、そのリスト項目に関連する詳細を表示する新しいフラグメント (フラグメント D) を ViewPager に追加したいと考えています。

ユーザーがフラグメント 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 が正しく追加され、バンドル経由で渡された正しい情報が表示されますが、これは初回のみ機能します。FragmentC に戻って別のリスト項目をクリックすると、同じ FragmentD が表示され、FragmentD の新しいインスタンスを作成しているにもかかわらず、そのonCreateViewメソッドが呼び出されません。あたかもメモリに残り、決して削除されないかのようです。

これを機能させる方法はありますか?ありがとう。

4

0 に答える 0