2013-09-26 3 views
2

Я хочу вкладку с 4 прокручиваемыми вкладками в классе. Я осуществил следующий пример, и он работает:Фрагмент в FragmentPagerAdapter

mAdapter = new MyAdapter(getSupportFragmentManager()); 
mViewPager = (ViewPager) findViewById(R.id.pager); 
mViewPager.setAdapter(mAdapter); 

...

public static class MyAdapter extends FragmentPagerAdapter { 
    public MyAdapter(FragmentManager fm) { 
     super(fm); 
    } 
    @Override 
    public int getCount() { 
     return NUM_ITEMS; //NUM_ITEMS=4 
    } 
    @Override 
    public ArrayListFragment getItem(int position) { 
     return ArrayListFragment.newInstance(position); 
    } 
    @Override 
    public CharSequence getPageTitle(int position) { 
     switch(position) { 
     case 0: 
      return "TAB1"; 
     case 1: 
      return "TAB2"; 
     case 2: 
      return "TAB3"; 
     case 3: 
      return "TAB4"; 
     default: 
      return "ERROR"; 
     }  
    } 
} 

...

public static class ArrayListFragment extends ListFragment { 
    int mNum; 

    static ArrayListFragment newInstance(int num) { 
     ArrayListFragment f = new ArrayListFragment(); 

     Bundle args = new Bundle(); 
     args.putInt("num", num); 
     f.setArguments(args); 

     return f; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mNum = getArguments() != null ? getArguments().getInt("num") : 1; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     switch(mNum) { 
     case 0: 
      View v0 = inflater.inflate(R.layout.fragment_pager_list, container, false); 
      return v0; 
     case 1: 
      View v1 = inflater.inflate(R.layout.fragment_pager_list, container, false); 
      return v1; 
     case 2: 
      View v2 = inflater.inflate(R.layout.fragment_pager_list, container, false); 
      return v2; 
     case 3: 
      View v3 = inflater.inflate(R.layout.fragment_pager_list, container, false); 
      return v3; 
     default: 
      View vd = inflater.inflate(R.layout.fragment_pager_list, container, false); 
      return vd;    
     } 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, Titles)); 
    } 
    //Titles={"TAB1", "TAB2", "TAB3", "TAB4"} 
    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     Log.i("FragmentList", "Item clicked: " + id); 
    } 


} 

где fragment_pager_list макет, который я поставил в каждом представлении выглядит следующим образом:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@android:drawable/gallery_thumb"> 

<TextView android:id="@+id/text" 
    android:layout_width="match_parent" android:layout_height="wrap_content" 
    android:gravity="center_vertical|center_horizontal" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:text="HELLO WORLD"/> 

<!-- The frame layout is here since we will be showing either 
the empty view or the list view. --> 
<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="0dip" 
    android:layout_weight="1" > 
    <!-- Here is the list. Since we are using a ListActivity, we 
     have to call it "@android:id/list" so ListActivity will 
     find it --> 
    <ListView android:id="@android:id/list" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:drawSelectorOnTop="false"/> 

    <!-- Here is the view to show if the list is emtpy --> 
    <TextView android:id="@android:id/empty" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:text="No items."/> 

</FrameLayout> 

Проблема в том, что я хочу поместить разный макет в каждое представление для каждой вкладки. Я попытался изменить код, чтобы «ArrayListFragment» наследовал от «Fragment» вместо «ListFragment» для загрузки макетов, которые не содержат «ListView», но «RelativeLayout» или «LinearLayout», но не может заставить его работать.

Пожалуйста, если кто-нибудь может мне помочь, мне нужно загрузить различные виды на вкладках и содержать в них другие элементы, кроме ListView.

спасибо.

+0

Используя ListFragment, автоматически обнаруживает ListView в макете ... что я должен реализовать в макете, чтобы метод обнаружил его с помощью Fragment вместо ListFragment и мог видеть его в представлении для каждой вкладки? A <фрагмент ...>? Спасибо. – KryNaC

ответ

3

Вам лучше сделать каждый фрагмент для разной компоновки. Вы можете добавить addFragment(Fragment fragment) в метод MyAdapter.

mAdapter = new MyAdapter(getSupportFragmentManager()); 
for(int i=0; i<4; i++) { 
    Fragment fragment = null; 
    switch(i) { 
    case 0: 
     fragment = FirstFragment.newInstance(); 
     break; 
    case 1: 
     fragment = SecondFragment.newInstance(); 
     break; 
    case 2: 
     fragment = ThirdFragment.newInstance(); 
     break; 
    case 3: 
     fragment = FourthFragment.newInstance(); 
     break; 
    } 
    mAdapter.addFragment(fragment); 
} 
mViewPager = (ViewPager) findViewById(R.id.pager); 
mViewPager.setAdapter(mAdapter); 

MyAdapter: Адаптер представляет собой простой контейнер.

public static class MyAdapter extends FragmentPagerAdapter { 
    private List<Fragment> mFragmentList; 

    public MyAdapter(FragmentManager fm) { 
     super(fm); 
     mFragmentList = new ArrayList<Fragment>(); 
    } 

    publid void addFragment(Fragment fragment) { 
     mFragmentList.add(fragment); 
    } 

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

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

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

CustomFragment: Поместите общие методы для каждого фрагмента.

public abstract class CustomFragment extends Fragment { 
    public abstract Fragment newInstance(); 
    public abstract String getPageTitle(); 
} 

Первый фрагмент: надуть разный макет для каждого фрагмента.

public class FirstFragment extends CustomFragment { 

    @Override 
    public Fragment newInstance() { 
     Fragment f = new FirstFragment(); 
     return f; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     super.onCreateView(inflater, container, savedInstanceState); 

     View view = inflater.inflate(R.layout.LAYOUT_ID_FOR_FIRST_FRAGMENT, container, false); 

     // Some codes for layout such as findViewById 

     return view; 
    } 

    @Override 
    public String getPageTitle() { 
     // return TITLE_FOR_FRAGMENT 
    } 
} 

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

+0

Спасибо за помощь Раэгон. Я тестирую код, но мне не нужен метод newInstance в каждом методе Fragment (FirstFragment, ...), который вы вызываете в первом коммутаторе. – KryNaC

+0

Кроме того, FirstFragment должен быть статическим методом, чтобы вызвать его в коммутаторе нет? – KryNaC

+0

Я добавил абстрактный метод 'newInstance' в' CustomFragment'. – Raegon

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