2013-09-26 6 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"가 "ListFragment"대신 "Fragment"를 상속하여 "ListView"가 아닌 "RelativeLayout"또는 "LinearLayout"이 포함 된 레이아웃을로드 할 수 있도록 코드를 수정하려고 시도했지만 작동하지 못하게했습니다.

누구든지 나를 도울 수 있다면 탭에 다른보기를로드해야하며 ListView 이외의 요소가 포함되어 있어야합니다.

대단히 감사합니다.

+0

ListFragment를 사용하면 레이아웃의 ListView가 자동으로 감지됩니다. 레이아웃에 구현해야하는 메소드는 ListFragment 대신 Fragment를 사용하여 감지하고 각 탭의보기에서 볼 수 있습니까? A ? 감사합니다. – KryNaC

답변

3

각 조각을 다른 레이아웃으로 만드는 것이 좋습니다. MyAdapteraddFragment(Fragment fragment) 방법을 추가 할 수 있습니다.

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(); 
} 

FirstFragment 각 단편에 대한 다른 레이아웃을 팽창.

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

Raegon에게 도움을 주셔서 감사합니다. 코드를 테스트하고 있지만 첫 번째 스위치에서 호출하는 Fragment (FirstFragment, ...)의 모든 메서드에서 "newInstance"메서드가 없습니다. – KryNaC

+0

또한 FirstFragment는 정적 메서드로 스위치에서 호출하지 않아야합니까? – KryNaC

+0

나는'CustomFragment'에 추상 newInstance 메소드를 추가했습니다. – Raegon