0

私はかなり基本的なことをしようとして、ぐるぐる回っています。DialogFragmentユーザー入力を受け入れる があり、送信時にの一部である をListView更新します。 FragmentViewPager

が更新されないことを除いて、すべてが機能Fragmentしています。ListViewただし、データが更新されるため、少し混乱しますが、更新されたデータを表示するには、いくつかのビューをスワイプしてからもう一度戻す必要があります。

いくつかの調査を行った後、私はgetItemPositionandを使用することになっnotifyDataSetChangedておりViewPager、動作するはずです。問題は、呼び出すと例外がスローされることですnotifyDataSetChangedRecursive entry to executePendingTransactions

主な活動

public class Main extends SherlockFragmentActivity implements MyListFragment.OnRefreshAdapterListener, DialogConfirmation.OnRefreshKeywordsListener //Updated Code
{
    private static List<Fragment> fragments;

    @Override
    public void onCreate(final Bundle icicle)
    {    
        setContentView(R.layout.main);
    }

    @Override
    public void onResume()
    { 
        mViewPager = (ViewPager)findViewById(R.id.viewpager);

        fragments = new ArrayList<Fragment>();

        fragments.add(new MyListFragment()); //fragment with the ListView

        fragments.add(MyDetailFragment.newInstance(0));
        fragments.add(MyDetailFragment.newInstance(1));
        fragments.add(MyDetailFragment.newInstance(2));

        mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
        mViewPager.setAdapter(mMyFragmentPagerAdapter);
    }

    private static class MyFragmentPagerAdapter extends FragmentStatePagerAdapter  {  

        public MyFragmentPagerAdapter(FragmentManager fm) {  
             super(fm);  
        }  

        @Override  
        public Fragment getItem(int index) {
            return fragments.get(index);
        }  

        @Override
        public int getCount() {  
             return 4;  
        }

        @Override
        public int getItemPosition(Object object) {
            return POSITION_NONE;
        }
   }

    @Override
    public void onRefreshAdapterListener() {
        this.mMyFragmentPagerAdapter.notifyDataSetChanged();
    }

    //Updated Code
    @Override
    public void onRefreshTextListener() {
        MyListFragment tf = (MyListFragment)getSupportFragmentManager().findFragmentById(R.id.fragmentText);

        if (tf == null)
            tf = (MyListFragment)this.fragments.get(0);

            tf.RefreshText();       
    }
}

リストフラグメント

public class MyListFragment extends SherlockListFragment
{
    OnRefreshAdapterListener mRefreshAdapter;

    @Override
    public void onActivityCreated(Bundle savedState) {

        adapter = new CustomAdapter();

        /*code to add items to adapter */

        this.setListAdapter(adapter);

        adapter.notifyDataSetChanged();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);

        if (getArguments() != null && getArguments().getString("text").length() > 0)
        {
            SaveText(getArguments().getString("text"));
            this.mRefreshAdapter.onRefreshAdapterListener(); //this line causes a "java.lang.IllegalStateException: Recursive entry to executePendingTransactions" exception
        }

        return inflater.inflate(R.layout.listing, container, false);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        mRefreshAdapter = (OnRefreshAdapterListener)activity;
    }

    public interface OnRefreshAdapterListener {
        public void onRefreshAdapterListener();
    }


    @Override
    public void onDialogTextAdd(final String text) {
    }   
}

ダイアログフラグメント

public class DialogTextAdd extends DialogFragment implements OnEditorActionListener {

    private EditText mText;
    OnRefreshTextListener mTextKeywords; //Updated Code

    public interface DialogTextAddListener {
        void onDialogTextAdd(final String inputText);
    }

    public DialogTextAdd() {
        // Empty constructor required for DialogFragment
    }

    //Updated Code
    @Override
    public void onAttach(Activity act) {
        super.onAttach(act);
        mTextKeywords = (OnRefreshTextListener)act;
    }

    @Override
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.dialog_edit, container);
        mText = (EditText)view.findViewById(R.id.text_add);
        getDialog().setTitle("Add Text");

        // Show soft keyboard automatically
        mText.requestFocus();
        getDialog().getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);
        mText.setOnEditorActionListener(this);

        return view;
    }

    @Override
    public boolean onEditorAction(final TextView v, final int actionId, final KeyEvent event) {
        if (EditorInfo.IME_ACTION_DONE == actionId) {

            MyListFragment mf = new MyListFragment();
            Bundle args = new Bundle();
            args.putString("text", mText.getText().toString());
            mf.setArguments(args);

            //this seems to be intefering with the notifyDataSetChanged in the listing fragment
            getActivity().getSupportFragmentManager().beginTransaction().add(mf, "my_fragment").commit();

            mTextKeywords.onRefreshTextListener(); //Updated Code

            this.dismiss();
            return true;
        }
        return false;
    }
}
4

1 に答える 1

1

ListView を持つ Fragment が更新されないことを除いて、すべてが機能しています。

FragmentActivityの新しいインスタンスを作成して追加しても意味がありませんMyListFragment。あなたのコードから、使用するフラグメントをリストに保存しているように見えるので、それらへの参照があります(また、好奇心から、フラグメントを縦向きに設定し、電話を回転させ、使用を再試行しましたDialogFragmentか? )。これらのフラグメントへの参照があるということは、リストからそれらをいつでも取得し、それらを使用して更新/更新メソッドを呼び出すことができることを意味します。

于 2013-01-25T06:54:19.087 に答える