2016-11-29 14 views
0

複数のフラグメントを持つアクティビティがあります。これらのフラグメントはすべて、そのMasterActivty内のデータオブジェクトを参照します。 MasterActivtiyはデータを更新することがあります。アクティビティ更新時にデータを更新するタブページ・フラグメント

データの断片にどのように通知するのですか?

私は放送局などの方法を試しましたが、どうやってそれを行うのか分かりません。

私はこれらの質問を見ましたOnetwo。私の実装には実際には意味がありませんでした。さまざまなタブを読み込むためにFragmentPagerAdapterを使用しています。ここで

は私のコードは次のとおりです。

MasterActivity.java

public class MasterActivity extends AppCompatActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_master); 

TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); 
     tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.ic_details)); 
     tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.ic_notes)); 

     final ViewPager viewPager = (ViewPager) findViewById(R.id.pager); 
     final PagerAdapter adapter = new TabPagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount()); 
     viewPager.setAdapter(adapter); 

     viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 

     tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
      @Override 
      public void onTabSelected(TabLayout.Tab tab) { 
       viewPager.setCurrentItem(tab.getPosition()); 
      } 

      @Override 
      public void onTabUnselected(TabLayout.Tab tab) { 

      } 

      @Override 
      public void onTabReselected(TabLayout.Tab tab) { 

      } 
     }); 

    } 

      refreshData(); 

    } 

    public void refreshData() { 
     //do a background task to get data 


     //WHEN FINISHED TELL FRAGMENTS TO reloadData() 

    } 
    } 

TabPagerAdapter.java

public class TabPagerAdapter extends FragmentPagerAdapter { 

    int tabCount; 

    public TabPagerAdapter(FragmentManager fm, int numberOfTabs) { 
     super(fm); 
     this.tabCount = numberOfTabs; 
    } 

    @Override 
    public Fragment getItem(int position) { 

     switch (position) { 
      case 0: 
       DetailsFragment tab1 = new DetailsFragment(); 
       return tab1; 
      case 1: 
       NotesFragment tab4 = new NotesFragment(); 
       return tab1; 
      default: 
       return null; 
     } 
    } 

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

} 

フラグメント

public class DetailsFragment extends Fragment { 
    private String TAG = getClass().getSimpleName(); 


    public DetailsFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_details, container, false); 


     viewStatus = (LinearLayout) view.findViewById(R.id.viewStatus); 
     scrollViewDetails = (LinearLayout) view.findViewById(R.id.scrollViewDetails); 

     return view; 
    } 


    private void reloadData() { 
     Log.i(TAG, "REALOAD DETAILS FRAGMENT"); 

     //Fill the text views with the data from the MasterActivity 

    } 

} 

答えて

1

私は通常これを行う方法は、次のとおりです。

  • が活動に

    追加をimpls(断片)を登録解除/登録する機能を与えるインターフェース

    public interface DataReloadListener { 
        void onDataReloaded(Object data); // use your data type here 
    } 
    
  • を定義しますリスナーを追跡するためのデータ構造体:

    private List<DataReloadListener> mListeners; 
    

    コンストラクタで初期化することを忘れないでください:

     mListeners = new ArrayList<>(); 
    

    は、活動にレジスタ/登録解除メソッドを追加します。

    public synchronized void registerDataReloadListener(DataReloadListener listener) { 
         mListeners.add(listener); 
        } 
    
        public synchronized void unregisterDataReloadListener(DataReloadListener listener) { 
         mListeners.remove(listener); 
        } 
    
  • は、フラグメントは、インターフェイスを実装し、ために/登録解除を登録する持っていますイベント

    @Override 
        public void onDataReloaded(Object data) { 
    
         // update any fragment state here 
    
         // if you are updating the UI, check that the fragment currently has a view 
         if (getView() != null) { 
          // update UI here 
         } 
        } 
    

    オーバーライドonAttach()と/登録解除を登録する断片で:

    @Override 
        public void onAttach(Activity activity) { 
         super.onAttach(activity); 
         ((MasterActivity) activity).registerDataReloadListener(this); 
        } 
    
        @Override 
        public void onDetach() { 
         ((MasterActivity) getActivity()).unregisterDataReloadListener(this); 
         super.onDetach(); 
        } 
    
  • イベントが発生し、すべてこのインフラストラクチャは、あなたの断片であるため必要である

    public synchronized void onDataReloaded(Object data) { 
         for (DataReloadListener listener : mListeners) { 
          listener.onDataReloaded(data); 
         } 
        } 
    

活動に登録されているすべてのリスナーのためonDataReloadedを呼び出しますユーザーがスワイプする方法に応じて、イベントの時点で存在する場合と存在しない場合があります。

+0

共有いただきありがとうございます。私はこれを実装させて、私はあなたに戻ってきます –

関連する問題