2013-02-05 22 views
5

いくつかのフラグメントを表示するためにビューページャーを使用しようとしています。現時点では、フラグメントは1つしかありませんが、インスタンス化されることはありません。私はpager.setCurrentItem(0)を使ってみましたが、アダプタ内のgetItemメソッドは決して呼び出されません。私のフラグメントが以下のコードにロードされていない理由は誰にも見えますか?ViewPager + Fragments - フラグメントが表示されない

主な活動

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()あなたはNフラグメントをインスタンス化する場合は、それはNを返す必要がありますので、何のフラグメントが作成されませんMyPagerAdapterに0を返しています。

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

関連する問題