10

次が分からなくて困っています。

私が持っているもの:ビューページャーとその中にいくつかのページがあります。この質問では、それらのうちの 2 つだけが重要です。それらを Fragment1 と Fragment2 と呼びましょう。それらは互いに隣り合っています。Fragment1 には、インターネット (外部データベース) からのデータで満たされたリストビューが含まれています。Fragment2 には単純なボタンが含まれています。

私の目標: Fragment2 のボタンをクリックすると、新しいアイテムが外部データベースに追加されます。この新しいアイテムで Fragment1 のリストビューを更新/更新したいと思います。

私のnotifyDataChanged()場合は機能しませんが、これまでのところ、すべてのページが再インスタンス化されると確信していました..私の問題をできるだけ明確な方法で紹介するので、私が持っているコードを見てみましょう。これが私のViewPagerアダプターです:

class MyPagerAdapter extends FragmentStatePagerAdapter {
        public List<String> fragmentsA; 

        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
            fragmentsA = fragments;
        }

        @Override
        public Fragment getItem(int position) {
           return Fragment.instantiate(context, fragmentsA.get(position));

        }

        @Override
        public CharSequence getPageTitle(int position) {
           return mEntries.get(position % CONTENT.length).toUpperCase();
        }

        @Override
        public int getCount() {
          return mEntries.size();
        }

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

Fragment1 onCreateView() (まもなく):

public View onCreateView(LayoutInflater inflater, final ViewGroup container,
            Bundle savedInstanceState) {

    getData();
    View view = inflater.inflate(R.layout.latestapps_tab, container, false);
    lw = (ListView) view.findViewById(R.id.lw);
    context = getActivity().getApplicationContext();
    act = this.getActivity();
    m_adapter = new ItemAdapter();
    lw.setAdapter(m_adapter);

return view;
}

とアダプターを作成しViewPager、アダプターを設定してViewPagerから、ビューページャーに Main クラスのフラグメントを入力します。この後、2 つのフラグメントで完全に機能する ViewPager を作成します。

  pager = (ViewPager)findViewById( R.id.viewpager );
  adapter = new MyPagerAdapter(getSupportFragmentManager());
  indicator = (TabPageIndicator)findViewById( R.id.indicator );
  pager.setAdapter( adapter );
  indicator.setViewPager( pager );
  pager.setCurrentItem(INITIAL_PAGE);
  pager.setOffscreenPageLimit(3);

  //adding fragments to the pager
  fragments.add( Fragment1.class.getName());    
  fragments.add( Fragment2.class.getName()); 

Fragment1 には、すべてのリスト項目にいくつかのテキストビューを含むリストビューがあります。ロードは完全に機能します。 を作成し、ArrayListsそれらのリストに外部データベースからのデータを入力します。読み込みが完了したら、リストビューにこれらの大量のデータを入力します。Fragment 2でボタンをクリックすると、そのリストビューを更新して、外部データベースからのデータを使用してリストビューに新しい行を作成する必要があります。(もちろん、データベースへの書き込みは機能します)

私の推測では、ArrayLists を更新しないか、Fragment1 を再インスタンス化しない可能性があるため、getDataFromSQL() メソッドは、アプリケーションを終了して再度起動するか、ViewPager でスワイプしすぎて Fragment1 が切り離された場合にのみ回転しません。そのため、Fragment1 を更新または更新できません。誰かがこの質問で助けてくれますか?

編集

Fragment2にメッセージを配信してそれ自体を更新することで、なんとかそれを実現しました。しかし、それが良い解決策であるかどうかはわかりません。より良い方法はありません。つまり、何らかの形でフラグメント全体を更新するだけです。

解決

さて、それは私の怠惰だったに違いないと思いますが、今は解決しました。フラグメントを別のフラグメントから更新したい、またはフラグメント間の接続を作成したいすべての人のために、適切なアプローチを説明します。

  1. ホルダーアクティビティを介してフラグメント間の通信を支援する独自のリスナーを実装する必要があります。これはhttp://developer.android.com/training/basics/fragments/communicating.htmlにあります。非常にシンプルで便利です。

  2. フラグメントを取得する必要がありますが、これも簡単です。ViewPager からフラグメントを取得するこれらの Q はいくつかの受け入れ可能な方法を提供します。私はそのSpareArray解決策を使用しました。

とにかく助けてくれてありがとう!

4

1 に答える 1

3

アクティビティからフラグメントを取得できる必要があります。そのためには、アダプターからフラグメントを取得する必要があります。ページ アダプターにいくつかのメソッドを追加する必要があります。

public Fragment getFragment(ViewPager container, int position, FragmentManager fm) {
    String name = makeFragmentName(container.getId(), position);
    return fm.findFragmentByTag(name);
}

private String makeFragmentName(int viewId, int index) {
    return "android:switcher:" + viewId + ":" + index;
}

次に、アクティビティから次のメソッドを作成します

public Fragment getFragmentbyPosition(int position) {
    return adapter.getFragment(pager, position, getSupportFragmentManager());
}

fragment2 で次のように呼び出します。

Fragment1 fragment1 = (Fragment1) ((MyActivity)getActivity()).getFragmentbyPosition(0);

これで、フラグメント 2 からフラグメント 1 のパブリック メソッドを呼び出すことができるようになるので、onClick でそれを使用し、フラグメント 1 にリストビューを更新するように指示します。

makeFragmentName が機能する理由は、FragmentPagerAdapter が作成するフラグメントのタグを作成する方法です。

于 2013-04-26T22:04:10.360 に答える