2013-02-05 44 views
5

我想使用viewpager来显示几个片段。目前我只有一个片段,但它似乎永远不会被实例化。我尝试使用pager.setCurrentItem(0),但适配器中的getItem方法永远不会被调用。有没有人看到为什么我的片段不加载在下面的代码?ViewPager +片段 - 片段未显示

主要活动

public class MainActivity extends SherlockFragmentActivity { 

MyPagerAdapter adapter; 

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

    // Create the FragmentPager Adapter and assign it to the viewpager 
    adapter = new MyPagerAdapter(getSupportFragmentManager(), this); 
    ViewPager pager = (ViewPager) findViewById(R.id.pager); 
    pager.setAdapter(adapter); 
    pager.setCurrentItem(0); 

    // Setup the tab page indicator 
    TabPageIndicator indicator = (TabPageIndicator) findViewById(R.id.indicator); 
    indicator.setViewPager(pager); 
} 

class MyPagerAdapter extends FragmentStatePagerAdapter { 
    private SparseArray<Fragment> fragmentPageMap; 

    public MyPagerAdapter(FragmentManager fm, Activity context) { 
     super(fm); 
     fragmentPageMap = new SparseArray<Fragment>(); 
    } 

    @Override 
    public Fragment getItem(int index) { 
     switch (index) { 
     case 0: 
      if (fragmentPageMap.get(index) != null) { 
       SherlockListFragment scheduleFragment = ScheduleListFragment.newInstance(); 
       fragmentPageMap.put(index, scheduleFragment); 
       return scheduleFragment; 
      } else { 
       return fragmentPageMap.get(index); 
      } 
     default: 
      return null; 
     } 
    } 

    /*@Override 
    public void destroyItem(View container, int index, Object object) { 
     super.destroyItem(container, index, object); 
     fragmentPageMap.remove(index); 
    }*/ 

    @Override 
    public CharSequence getPageTitle(int index) { 
     return ((ViewPagerPage) fragmentPageMap.get(index)).getTitle(); 
    } 

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

public interface ViewPagerPage { 
    String getTitle(); 
} 

MainActivity布局

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" > 

<com.viewpagerindicator.TabPageIndicator 
    android:id="@+id/indicator" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textStyle="bold" /> 

<android.support.v4.view.ViewPager 
    android:id="@+id/pager" 
    android:layout_width="fill_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1" /> 

</LinearLayout> 

ScheduleListFragment

public class ScheduleListFragment extends SherlockListFragment implements ViewPagerPage { 

private ScheduleAdapter adapter; 
private final String TITLE = "Schedule"; 

public static ScheduleListFragment newInstance() { 
    ScheduleListFragment newFrag = new ScheduleListFragment(); 
    Bundle args = new Bundle(); 
    newFrag.setArguments(args); 
    return newFrag; 
} 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.fragment_schedule_list, null); 
} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    inflater.inflate(R.menu.fragment_schedule_list, menu); 
} 

// Container Activity must implement this interface 
public interface OnAddItemClickedListener { 
    public void onAddItemClicked(); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle item selection 
    switch (item.getItemId()) { 
    case R.id.add_item: 
     Intent myIntent = new Intent(getActivity(), AddScheduleItemActivity.class); 
     startActivityForResult(myIntent, 1); 

     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    setHasOptionsMenu(true); 

    adapter = new ScheduleAdapter(getActivity()); 

    setListAdapter(adapter); 
} 

private class SampleItem { 
    public String tag; 
    public int iconRes; 

    public SampleItem(String tag, int iconRes) { 
     this.tag = tag; 
     this.iconRes = iconRes; 
    } 
} 

public class ScheduleAdapter extends ArrayAdapter<SampleItem> { 

    public ScheduleAdapter(Context context) { 
     super(context, 0); 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.results_list_row, null); 
     } 
     ImageView icon = (ImageView) convertView.findViewById(R.id.row_icon); 
     icon.setImageResource(getItem(position).iconRes); 
     TextView title = (TextView) convertView.findViewById(R.id.row_title); 
     title.setText(getItem(position).tag); 

     return convertView; 
    } 

} 

@Override 
public String getTitle() { 
    return TITLE; 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == android.app.Activity.RESULT_OK) { 
     String name = (String) data.getExtras().get("TEXT"); 
     Toast.makeText(getActivity(), name, Toast.LENGTH_LONG).show(); 
    } 
} 

片段布局

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<ListView 
    android:id="@android:id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" /> 

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="TextView" /> 

</LinearLayout> 

谢谢, 弥敦道

目前的解决方案:

改变了适配器的构造函数初始化第一个片段,并将其添加到内部地图。有没有人看到这样做有什么问题,或者改善上述任何代码的方法?谢谢!

public MyPagerAdapter(FragmentManager fm, Activity context) { 
     super(fm); 
     fragmentPageMap = new SparseArray<Fragment>(); 
     SherlockListFragment scheduleFragment = ScheduleListFragment.newInstance(); 
     fragmentPageMap.put(0, scheduleFragment); 
    } 

回答

4

getCount()MyPagerAdapter所以没有片段将被创建返回0,它应该返回N如果你想N片段被实例化。

fragmentPageMap是在构造函数创建为空时getCount()被调用,getCount()getItem(index)之前调用,这就是为什么getCount()返回0

在这种情况下,你不需要switch因为你是实例相同每次碎片。但是如果你在实例化不同片段的时候你会需要它。

@Override 
public Fragment getItem(int index) { 
    switch (index) { 
    case 0: 
     return new Fragment1(); 
    case 1: 
     return new Fragment2(); 
    } 
    return null; 
} 
+0

*为什么*你认为getCount()返回0?请详细说明以作出更好的回答。 –

+0

因为'fragmentPageMap'在构造函数中创建,并且在调用getCount()时为空。 'getCount()'在'getItem(index)'之前被调用。你可以在调试器中查看。 – rubenlop

+0

谢谢!你是对的返回0.然而,我不认为值应该硬编码,我想能够动态地添加/删除片段。 switch语句在那里,因为不久将会添加更多的片段。 – Nath5