2016-06-29 6 views
4

Объяснение:Как я могу создать динамическую вкладку с viewpager в android?

Предположим, у меня есть несколько категорий, которые приходят из моего REST. Я не знаю, сколько категорий оно должно быть 5,7 или иногда 2 и т. Д. Я хочу поместить все категории на свою вкладку с помощью viewpager. Я хочу создать вкладку в соответствии с размером категорий. давайте посмотрим, например. предположим, что в моем ответе REST есть только 2 категории, он создает только две вкладки. если он имеет 5 категорий, то 5 вкладки и т. д.

Вот пример тестового примера для создания вкладок.

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    TabLayout tabLayout; 
    ViewPager viewPager; 
    Toolbar toolbar; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     toolbar=(Toolbar)findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     tabLayout=(TabLayout)findViewById(R.id.tabs); 
     viewPager=(ViewPager)findViewById(R.id.viewpager); 

     setupViewPager(viewPager); 
     viewPager.setCurrentItem(0); 
     tabLayout.setupWithViewPager(viewPager); 
    } 
    private void setupViewPager(ViewPager viewPager) { 
     ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
     for(int i=0;i<3;i++){ 
      adapter.addFragment(new OneFragment(), "ONE"); 
//   adapter.addFragment(new TwoFragment(), "TWO"); 
      viewPager.setAdapter(adapter); 
     } 
    } 
} 

ViewPagerAdapter.java

public class ViewPagerAdapter extends FragmentPagerAdapter { 

    private final List<Fragment> mFragmentList = new ArrayList<>(); 
    private final List<String> mFragmentTitleList = new ArrayList<>(); 

    public ViewPagerAdapter(FragmentManager manager){ 
     super(manager); 
    } 

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

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

    public void addFragment(Fragment fragment,String title){ 
     mFragmentList.add(fragment); 
     mFragmentTitleList.add(title); 
    } 

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

Пожалуйста, Как я могу решить из ???

ответ

2

, если бы я тебя, я хотел бы попробовать что-то вроде этого:

его не идеальное решение только представление о том, как вы можете сделать это, вам нужно будет дополнительно изменить его.

Создайте number of fagments = total number of categeries и назовите их как fragment0, fragment1 и так далее, чтобы общее количество категорий.

, а затем получить число categeries первых позволяет говорить

int count = number of categeries; 

, а затем добавить фрагменты ViewPager как этот

ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    for(int i=0; i <= count; i++){ 
     adapter.addFragment(new Fragment(i)(), "ONE"); 
     viewPager.setAdapter(adapter); 
    } 
} 

и назвать фрагменты, то есть вкладка название вы можете сделать список фрагмента названия, что-то вроде этого

private final String[] title = {"One", "Two","Three"}; 

ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
     for(int i=0; i < count; i++){ 
      adapter.addFragment(new Fragment(i)(), title[i]); 
      viewPager.setAdapter(adapter); 
     } 
    } 

Надеюсь, это поможет

3

После получения категории размера, вы можете добавить динамические вкладки в соответствии ваши категорий размера, как показано ниже:

public class MainActivity extends AppCompatActivity { 

TabLayout tabLayout; 
ViewPager viewPager; 
Toolbar toolbar; 
int no_of_categories=-1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    toolbar=(Toolbar)findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    tabLayout=(TabLayout)findViewById(R.id.tabs); 
    viewPager=(ViewPager)findViewById(R.id.viewpager); 

    no_of_categories=YOUR_NO_CATEGORIES; 

    for (int i = 0; i < no_of_weeks; i++) { 
     tabLayout.addTab(tabLayout.newTab().setText("TAB " + String.valueOf(i + 1))); 
    } 

    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager(),tabLayout.getTabCount()); 
    viewPager.setAdapter(adapter); 

    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) { 

     } 
    }); 


    } 
} 

И ваш адаптер класс должен быть, как показано ниже:

public class ViewPagerAdapterextends FragmentStatePagerAdapter { 
int mNumOfTabs; 
Fragment fragment = null; 

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

@Override 
public Fragment getItem(int position) { 

    for (int i = 0; i < mNumOfTabs ; i++) { 
     if (i == position) { 
      fragment = YourFragment.newInstance(); 
      break; 
     } 
    } 
    return fragment; 

} 

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

@Override 
public CharSequence getPageTitle(int position) { 
    return super.getPageTitle(position); 
} 
} 
+0

но каждый фрагмент имеет это собственный файл макета, как я могу управлять ими. –

+0

В вашем случае, если я изменю какой-либо layout.xml, это повлияет на каждую вкладку. –

+1

Если это так, вам нужно иметь некоторый флаг с каждой категорией, который определяет, какой фрагмент вам нужно загрузить, чтобы вы могли сделать эти виды макетов фрагментов статически в своем приложении, чтобы обрабатывать разные категории. – Drv

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