2017-02-16 6 views
0

Я уже давно застрял в этой проблеме. Я делаю приложение, которое имеет три почти одинаковых фрагмента. Я использовал this учебник. Я также пробовал передавать данные из MainActivity во все фрагменты (фрагменты - это ресторанный фрагмент, favouriteRestaurants, blockedRestaurants), и только Третий проблемный. Также когда я изменяю, какие данные отправляются на вкладку - первая и вторая вкладки получают правильные. Третья вкладка часто не вызывается вообще, и если она называется, она в основном получает неверные данные, в отличие от других двух вкладок, а также не отображается ошибка, когда я выбираю третью вкладку, и много раз, когда я пытаюсь оценить количество вкладок, в то время как отладка часто получает только 2 вкладки. Я пробовал this, this и множество других решений, но никто из них не работал для меня.Третий вкладчик получает значения, предоставленные второй вкладке

Иногда, если я выбираю третью вкладку перед второй, она отображает правильный список, но если я сначала выбираю второй, он просто копирует его вместо отображения правильных значений.

MainActivity:

TabLayout tabLayout = (TabLayout) findViewById(R.id.sliding_tabs); 
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_one))); 
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_two))); 
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_three))); 
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 
tabLayout.setTabMode(TabLayout.MODE_FIXED); 

final ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); 
final PagerAdapter adapter = new PagerAdapter 
      (getSupportFragmentManager(), tabLayout.getTabCount()); 
    viewPager.setAdapter(adapter); 
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
    tabLayout.setOnTabSelectedListener(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) { 

     } 
    }); 

PagerAdapter:

public class PagerAdapter extends FragmentStatePagerAdapter { 
int mNumOfTabs; 

public PagerAdapter(FragmentManager fm, int NumOfTabs) { 
    super(fm); 
    this.mNumOfTabs = NumOfTabs; 
} 

@Override  
public Fragment getItem(int position) { 

    switch (position) { 
     case 0: 
      return MapsFragment.newInstance(restaurants); 
     case 1: 
      return RestaurantsFragment.newInstance(restaurants); 
     case 2: 
      return MyRestaurantsFragment.newInstance(restaurants); 
     default: 
      return null; 
    } 
} 

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

Каждый фрагмент выглядит так же, как это:

public static MyRestaurantsFragment newInstance(ArrayList<Restaurant> restaurants) { 

    Bundle args = new Bundle(); 
    args.putSerializable("restaurants",restaurants); 

    MyRestaurantsFragment fragment = new MyRestaurantsFragment(); 
    fragment.setArguments(args); 
    return fragment; 
} 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    restaurantList = (ArrayList<Restaurant>)getArguments().getSerializable("restaurants"); 
    super.onCreate(savedInstanceState); 
} 

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

    listView = (ListView) view.findViewById(R.id.restaurants_list); 
    adapter = new RestaurantsListAdapter(getActivity(), restaurantList); 
    listView.setAdapter(adapter); 

    return view; 
} 

content_main:

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

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     app:popupTheme="@style/AppTheme.PopupOverlay" /> 

    <android.support.design.widget.TabLayout 
     android:id="@+id/sliding_tabs" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:tabMode="scrollable" /> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="0px" 
     android:layout_weight="1" 
     android:background="@android:color/white" /> 
</android.support.design.widget.AppBarLayout> 

ответ

1

Вы звоните setUpWithViewPager(...)?

// Give the TabLayout the ViewPager 
TabLayout tabLayout = (TabLayout) root.findViewById(R.id.sliding_tabs); 
tabLayout.setupWithViewPager(viewPager); 

Update

Чтобы увидеть заголовки, попытаться переопределить getPageTitle() внутри PagerAdapter, как это:

@Override 
public CharSequence getPageTitle(int position) { 
    if (position == 0) { 
     return "Title 1"; 
    } else if (position == 1) { 
     return "Title 2"; 
    } else { 
     return "Title 3"; 
    } 
} 

Кроме того, если вы используете tabLayout.setupWithViewPager, вы можете удалить эти части вашего код:

tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_one))); 
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_two))); 
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_three))); 

И

viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
    tabLayout.setOnTabSelectedListener(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) { 

     } 
    }); 

Я здесь предположим, что ваш макет что-то вроде этого:

<android.support.v4.view.ViewPager 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.design.widget.TabLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="top" /> 

</android.support.v4.view.ViewPager> 

Update 2

Попробуйте изменить метод getItem таким образом:

@Override 
public Fragment getItem(int position) { 

    if (position == 0) { 
     return MapsFragment.newInstance(restaurants); 
    } else if (position == 1) { 
     return RestaurantsFragment.newInstance(restaurants); 
    } 

    return MyRestaurantsFragment.newInstance(restaurants); 
} 
+0

Спасибо за ваш ответ Валентино. Я пробовал это, но у меня все еще есть такая же ошибка, и я также не вижу имена tablayout. – Kemo

+0

Я обновил ответ –

+0

Я также добавил свой макет. И даже при работе с названиями оригинальная проблема все еще присутствует. Третья вкладка никогда не отображает правильные значения. Он копирует вторую вкладку. – Kemo

1

Вы должны передать данные в адаптер и вызовите

MyRestaurantsFragment tab3 = MyRestaurantsFragment.newInstance(restaurants); 

вместо

MyRestaurantsFragment tab3 = new MyRestaurantsFragment(); 
+0

Спасибо за ваш ответ, я уже делаю это, случайно отправил старый код. Я обновил его сейчас. Но ошибка все еще существует. – Kemo

Смежные вопросы