web-dev-qa-db-ja.com

ビューページャータブのフラグメントが更新されない

4つのタブを持つビューページャーを取得しました..各タブにフラグメントがあります。最初のタブはフォーム(たとえば、Users)を含むフラグメントです。[保存]をクリックすると、データがデータベースに挿入されます。私の2番目のタブはフォーム付きの別のフラグメントですが、最初のタブ(データベースから取得しています)からのデータを使用してスピナーに入力します。最初のタブからデータを正常に挿入した後、2番目のタブではスピナーが空になっています。私のdbクエリは2番目のフラグメントのonCreateView()に実装されているため、アプリケーションの起動時に1回だけ呼び出されるため、タブ1とタブ2の間で変更してもonCreateView()またはonResume()は開始されません。私にとって興味深いことは、tab4に移動してからtab2に戻ると、データがスピナーに正しく格納されているため、どういうわけか現在のタブから2つのタブを離れてスワイプしてフラグメントを更新します。私の質問は、onCreateView()が1回だけ呼び出されたときにフラグメントを適切に更新するにはどうすればよいですか?

編集私はpsykhiがそのように提案したそのメソッドを配置しようとしました:

    this.mViewPager.setOffscreenPageLimit(0);
    this.mViewPager.setAdapter(this.mPagerAdapter);
    this.mViewPager.setOnPageChangeListener(this);

しかし、それは私のために働いていません。私は何かを逃していますか?

9
BlastFire

UPDATE:より良い方法があります。こちらをご覧ください: ViewPagerを動的に更新しますか?


Fragment内のViewPagersにアクセスするのは本当に悪い方法だったため、この回答のコンテンツを削除しています。より適切な方法については、上記のリンクを参照してください。

13
M-WaJeEh

「setOffscreenPageLimit(0)」の動作をシミュレートするために私が発見した最良の方法は、OnPageChangeListenerを使用して、アダプターのgetItemPositionメソッドをオーバーライドすることです。このようなもの:

カスタムページャーアダプター:

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

次に、ViewPagerを含むアクティビティで:

final MyPagerAdapter adapter = new MyPagerAdapter();
pager.setAdapter(adapter);
pager.setOnPageChangeListener(new OnPageChangeListener() {
     @Override
     public void onPageSelected(int position) {
          ... anything you may need to do to handle pager state ...
          adapter.notifyDataSetChanged(); //this line will force all pages to be loaded fresh when changing between fragments
     }
}

これは、OffscreenPageLimitを0に設定するのと同じ効果があります。ただし、この機能は、ViewPagerが提供するように設計されているものとは少し異なります。この方法でViewPagerを実装しようとしている場合は、レイアウトを再評価して、ViewPagerが本当に使用したいものであることを確認することをお勧めします。

11
Dave

フラグメントメソッドの最初のオーバーライド

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if(isVisibleToUser){
        actionView();//call the method to be refreshed
    }
    else{
        //no
    }

}
2
Issac Balaji

これは、viewpagerが「RAMに保持」するフラグメントの数を指定できるためです( setOffScreenPageLimit ():デフォルトは1だと思います)。したがって、2番目のフラグメントはリロードされません。そして、タブ3または4に移動すると、2つの最初のフラグメントが削除され、戻ってきたときに再作成されます。

フラグメントを更新するには、多くの方法があります。独自のリスナーインターフェイスを実装して、いつ更新するかを通知するか、コンテンツを更新するために実装するメソッドを呼び出すだけです。

2
psykhi

私の経験では、ViewPagersは以下を保持します。

  • 現在のタブ
  • &メモリ内のどちら側にも1つのタブ

つまり、1と2を切り替えると、内部では何も起こりません。つまり、単に非表示/表示されているようです。

しかし、タブ4に移動すると、タブ1と2が破棄されるため(onDestroy()が呼び出されます)、タブのいずれかに移動すると、タブが新しく再作成されます(onCreate()が呼び出されます)。

psykhi が示唆しているように、 setOffScreenPageLimit() を0にして、ナビゲートするたびに各フラグメントが作成されるようにすることができます。

他のページをパフォーマンスの目的でメモリに保持することに興味があった場合は、これを念頭に置いて設計されているため、メッセージング/イベントパブリッシングを使用できます。タブ1からフォームを送信すると、タブ1からタブ2にメッセージを送信して更新するように通知するシステム。

1
Cillian Myles

OK返信が遅くなる可能性があります。将来的に他の人を助ける可能性があるため、最近、dbからデータをタブにフェッチしているときに同じ問題に直面しました。最終的に私は出会った Otto このライブラリを使用すると、アプリ内で通信できます。

このライブラリをyourAdapter.notifyDataSetChanged()に使用するだけで、dbからデータをフェッチできます。

この動画は私を大いに助けてくれました https://www.youtube.com/watch?v=lVqBmGK3VuA

0
fasal shah