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);
}
*为什么*你认为getCount()返回0?请详细说明以作出更好的回答。 –
因为'fragmentPageMap'在构造函数中创建,并且在调用getCount()时为空。 'getCount()'在'getItem(index)'之前被调用。你可以在调试器中查看。 – rubenlop
谢谢!你是对的返回0.然而,我不认为值应该硬编码,我想能够动态地添加/删除片段。 switch语句在那里,因为不久将会添加更多的片段。 – Nath5