0

私はAndroidアプリを開発中です。私のアプリでは、ViewPagerでTabLayoutを使用しています。下部ナビゲーションバーの項目が選択されたときにTabLayoutのタブとそのフラグメントをプログラムで更新する必要があります。 TabLayoutのタブを更新することができます。しかし、ページャの断片は更新されません。TabLayoutのタブをプログラムで変更するが、ViewPagerのフラグメントは更新されない

これは問題です:

enter image description here

あなたが上記で見ることができるように、タブが変更されているが、その断片が変更されません。 List Fragmentが常に表示されます。選択された最初のタブですべてのフラグメントが同じになります。私は断片がまったく変わらないことを意味します。以下の私のコードを見てください。

これは、タブやビューページャのための私のXMLファイルです:

<android.support.design.widget.AppBarLayout android:layout_height="wrap_content" 
     android:layout_width="match_parent" android:theme="@style/AppTheme.AppBarOverlay"> 


     <android.support.design.widget.TabLayout 
      android:id="@+id/ma_tab_layout" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      app:tabGravity="fill" 
      app:tabMode="fixed" /> 

    </android.support.design.widget.AppBarLayout> 

    <android.support.v4.view.ViewPager 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" 
     android:id="@+id/ma_viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

は、これは私の全体の活動です:

public class MainActivity extends AppCompatActivity { 

    private BottomBar bottomBar; 
    private TabLayout topTabLayout; 
    private ViewPager mainViewPager; 
    private MainPagerAdapter pagerAdapter; 
    private ArrayList<Fragment> pagerFragments; 
    private ArrayList<String> pagerTitleList; 
    protected TfrApplication app; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     app = (TfrApplication)getApplication(); 
     setContentView(R.layout.activity_main); 
     initialize(); 
     initViews(); 
     setUpViews(); 
    } 

    private void initialize() 
    { 
     pagerFragments = new ArrayList<Fragment>(); 
     pagerTitleList = new ArrayList<String>(); 
    } 

    private void initViews() 
    { 
     bottomBar = (BottomBar)findViewById(R.id.ma_bottom_action_bar); 
     mainViewPager = (ViewPager)findViewById(R.id.ma_viewpager); 
     topTabLayout = (TabLayout)findViewById(R.id.ma_tab_layout); 
    } 

    private void setUpViews() 
    { 
     pagerAdapter = new MainPagerAdapter(getSupportFragmentManager(),pagerFragments,pagerTitleList); 
     mainViewPager.setAdapter(pagerAdapter); 
     topTabLayout.setupWithViewPager(mainViewPager); 
     setUpBottomBar(); 
    } 

    private void clearPagerFragments() 
    { 
     if(pagerAdapter!=null && pagerFragments!=null && pagerFragments.size()>0) 
     { 
      pagerFragments.removeAll(pagerFragments); 
      pagerTitleList.removeAll(pagerTitleList); 
      pagerAdapter.notifyDataSetChanged(); 
     } 
    } 

    private void setUpNewsPagerFragments() 
    { 
     NewsFragment latestNewsFragment = new NewsFragment(); 
     Bundle latestNewsBundle = new Bundle(); 
     latestNewsBundle.putInt(NewsFragment.FIELD_CATEGORY_ID,0); 
     latestNewsBundle.putInt(NewsFragment.FIELD_LEAGUE_ID,0); 
     latestNewsBundle.putInt(NewsFragment.FIELD_COUNTRY_ID,0); 
     latestNewsBundle.putInt(NewsFragment.FIELD_TEAM_ID,0); 
     latestNewsFragment.setArguments(latestNewsBundle); 
     pagerTitleList.add("LATEST"); 
     pagerFragments.add(latestNewsFragment); 

     PrioritizedTeamsFragment teamsFragment = new PrioritizedTeamsFragment(); 
     pagerTitleList.add("TEAMS"); 
     pagerFragments.add(teamsFragment); 

     NewsFragment articlesFragment = new NewsFragment(); 
     Bundle articlesBundle = new Bundle(); 
     articlesBundle.putInt(NewsFragment.FIELD_CATEGORY_ID, 0); 
     articlesBundle.putInt(NewsFragment.FIELD_LEAGUE_ID, 0); 
     articlesBundle.putInt(NewsFragment.FIELD_COUNTRY_ID, 0); 
     articlesBundle.putInt(NewsFragment.FIELD_TEAM_ID, 0); 
     articlesFragment.setArguments(articlesBundle); 
     pagerTitleList.add("ARTICLES"); 
     pagerFragments.add(articlesFragment); 

     TopFragment topFragment = new TopFragment(); 
     pagerTitleList.add("TOP 10"); 
     pagerFragments.add(topFragment); 
    } 

    private void setUpMatchesPagerFragments() 
    { 
     MatchesFragment matchesFragment = new MatchesFragment(); 
     pagerTitleList.add("MATCHES"); 
     pagerFragments.add(matchesFragment); 

     StatisticsFragment statisticsFragment = new StatisticsFragment(); 
     pagerTitleList.add("STATISTICS"); 
     pagerFragments.add(statisticsFragment); 
    } 

    private void setUpBottomBar() 
    { 
     bottomBar.setOnTabSelectListener(new OnTabSelectListener() { 
      @Override 
      public void onTabSelected(int tabId) { 
       switch (tabId){ 
        case R.id.bottom_tab_news: 
         clearPagerFragments(); 
         setUpNewsPagerFragments(); 
         pagerAdapter.notifyDataSetChanged(); 
         break; 
        case R.id.bottom_tab_matches: 
         clearPagerFragments(); 
         setUpMatchesPagerFragments(); 
         pagerAdapter.notifyDataSetChanged(); 
         topTabLayout.getTabAt(0).select(); 
         break; 

        case R.id.bottom_tab_meme: 
         Toast.makeText(getBaseContext(),"MEME",Toast.LENGTH_SHORT).show(); 
         break; 

        case R.id.bottom_tab_settings: 
         Toast.makeText(getBaseContext(),"Settings",Toast.LENGTH_SHORT).show(); 
         break; 
       } 
      } 
     }); 
    } 
} 

コード全体の活動はその問題を扱っているので、私は全体の活性を示しました。また、アクティビティ全体には、タブの作成、ページャの表示、およびボトムバーのコードしか含まれていません。すべてが接続されています。

これが私の見解ページャアダプタです:タブが変更されたとき

public class MainPagerAdapter extends FragmentPagerAdapter { 
    private ArrayList<Fragment> fragmentList; 
    private ArrayList<String> titleList; 

    public MainPagerAdapter(FragmentManager fragmentManager,ArrayList<Fragment> fragmentsParam,ArrayList<String> titlesParam) 
    { 
     super(fragmentManager); 
     this.fragmentList = fragmentsParam; 
     this.titleList = titlesParam; 
    } 

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

    @Override 
    public Fragment getItem(int position) { 
     return fragmentList.get(position); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return titleList.get(position); 
    } 
} 

はなぜビューページャのコンテンツまたはフラグメントが変更されていませんか?私のコードで何が間違っていますか?

topTabLayout.getTabAt(0).select(); 

私もこれを試してみました:両方が動作していない

mainViewPager.setCurrentItem(0); 

あなたは一番下の項目選択したリスナーに見ることができるように

は、私はこのような選択されたフラグメントを設定しようとしました。

答えて

0

フラグメントリストを交換し、このようなあなたのアダプタでnotifyDataSetChanged()を呼び出すメソッドを追加しよう:

public void notifyDataSetChanged(List<Fragment> list) { 
    fragmentList.removeAll(); 
    fragmentList.addAll(list); 
    notifyDataSetChanged(); 
} 

活動中のデータを変更し、adapter.notifyDataSetChanged()を呼び出すには、あなたのview.YouがgetItem()にログインすることができます更新に失敗することがありますデータ・セットが変更されたことをアダプターが認識しているかどうかを確認します。

0

ちょうどあなたがMatchesFragmentクラスで膨らませているレイアウトをチェックしてください。

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    v = inflater.inflate(R.layout.matches_fragment, container, false); 
} 
+0

インフレータブルなレイアウト。断片全体を更新するだけではありません。 –

関連する問題