2016-07-18 11 views
1

MaterialtTabHostとViewPagerを使用しています。新しいタブに切り替えるたびに新しいデータで自動的に更新する必要があります。タブが再選択されたときにフラグメントをリフレッシュする方法MaterialTabHost

これは、表示する別のフラグメントを持つViewPagerごとにタブとviewPagerを追加した私のアクティビティです。

public class FrontPage_Activity extends AppCompatActivity implements MaterialTabListener { 
    ViewPager mPager; 
    StorageUtil storageUtil; 
    User user; 
    MaterialTabHost tabHost; 
    Toolbar toolbar; 
    MyPageAdapter myPageAdapter; 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     for (int i = 0; i < myPageAdapter.getCount(); i++) { 
      tabHost.addTab(tabHost.newTab().setText(myPageAdapter.getPageTitle(i)).setTabListener(this)); 
     } 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_front_page_); 
     storageUtil = new StorageUtil(this); 
     storageUtil.setUserStatus(1); 
     user = storageUtil.getUser(); 
     toolbar = (Toolbar) findViewById(R.id.app_bar); 
     setSupportActionBar(toolbar); 
     ActionBar actionBar = getSupportActionBar(); 
     if (user != null) 
      actionBar.setTitle("Welcome " + user.getName()); 
     mPager = (ViewPager) findViewById(R.id.pager); 
     tabHost = (MaterialTabHost) findViewById(R.id.materialTabHost); 
     mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       tabHost.setSelectedNavigationItem(position); 
      } 
     }); 
     myPageAdapter = new MyPageAdapter(getSupportFragmentManager()); 
     mPager.setAdapter(myPageAdapter); 
     /*for (int i = 0; i < myPageAdapter.getCount(); i++) { 
      tabHost.addTab(tabHost.newTab().setText(myPageAdapter.getPageTitle(i)).setTabListener(this)); 
     }*/ 
     mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
      @Override 
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

      } 

      @Override 
      public void onPageSelected(int position) { 
       if (position == 0) { 
       } else if (position == 1) { 

       } 
      } 

      @Override 
      public void onPageScrollStateChanged(int state) { 

      } 
     }); 

    } 

    @Override 
    public void onTabSelected(MaterialTab tab) { 
     mPager.setCurrentItem(tab.getPosition()); 
    } 

    @Override 
    public void onTabReselected(MaterialTab tab) { 

    } 

    @Override 
    public void onTabUnselected(MaterialTab tab) { 

    } 

    class MyPageAdapter extends FragmentPagerAdapter { 
     String tabs[] = getResources().getStringArray(R.array.tabs); 

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

     @Override 
     public CharSequence getPageTitle(int position) { 
      return tabs[position]; 
     } 

     @Override 
     public Fragment getItem(int position) { 
      return setFragment(position); 
     } 

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

    private Fragment setFragment(int number) { 
     if (number == 0) { 
      Chats chats = new Chats(); 
      return chats; 
     } else if (number == 1) { 
      Request frag = new Request(); 
      return frag; 
     } else { 
      Invite frag = new Invite(); 
      return frag; 
     } 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.chatting_activity, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.logout: 
       storageUtil.clear(); 
       startActivity(new Intent(this, MainActivity.class)); 
       break; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public void onBackPressed() { 
     super.onBackPressed(); 
     moveTaskToBack(true); 
    } 
} 

答えて

0

まず第一に、これは少し厳しいかもしれない、1つのアプローチはまた、人々異なる結果を持って、まだテストを置くためにいくつかの方法は、最終的にはあります。

私が通常使用するアプローチの1つは、getItemPositionをオーバーライドすることです。あなた、カスタマーアダプタ(MyPageAdapter)で

、そのようgetItemPositionを上書き:

class MyPageAdapter extends FragmentPagerAdapter { 
... 
    @Override 
     public int getItemPosition(Object object) { 
     if (object instanceof Chats) { 
      ((Chats)object).updateMyLogicOrView(); 
     } 
     if (object instanceof Request) { 
      ((Request)object).updateMyLogicOrView(); 
     } 

    if (object instanceof Invite) { 
      ((Invite)object).updateMyLogicOrView(); 
     } 
     return super.getItemPosition(object); 
     } 
.. 
} 

はその後独自のタブに属する各フラグメントに、あなたはupdateMyLogicOrView()を作成します。このメソッドでは、ビューに新しいデータ/更新データを生成すると思われる操作をいくつか記述します。タブに移動すると、updateMyLogicOrView()が常にオーバーライドされたメソッドによって呼び出されます。

// put this method on each fragment class 
public void updateMyLogicOrView(){ 
// do some logics here.. 
// like component.setText() 
// or, adding some new elements to adapter.. 

} 
関連する問題