2013-02-05 19 views
5

Birkaç fragman görüntülemek için bir viewpager kullanmaya çalışıyorum. Şu anda sadece tek bir parçam var ama görünmeyecek gibi görünüyor. Pager.setCurrentItem (0) kullanmayı denedim ancak bağdaştırıcıdaki getItem yöntemi hiçbir zaman çağrılmıyor. Parçamın neden aşağıdaki kodda yüklenmediğini gören var mı?ViewPager + Fragments - Fragment gösterilmiyor

Faaliyet

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 Düzen

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

Fragman Düzen

<?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> 

sayesinde Nathan

Güncel Çözümleri:

ilk parçasını başlatmak ve iç haritaya eklemek için adaptörler yapıcı değiştirildi. Bunu yapan herhangi bir yanlışlık veya yukarıda belirtilen herhangi bir kodu iyileştirmenin bir yolu var mı? Teşekkürler!

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

cevap

4

getCount() Eğer N fragmanlar örneği oluşturulacak istiyorsanız N dönmelidir, bu yüzden hiçbir Fragment oluşturulacak MyPagerAdapter 0 bu geri dönüyor.

fragmentPageMap aynı başlatmasını çünkü getCount() döner 0 Bu durumda

bir switch gerekmez yüzden, yapıcı oluşturulan ve getCount() denir ve getCount()getItem(index) önce çağrıldığında boş olduğunu Her seferinde fragman. Ama eğer farklı Fragmanları ortaya çıkarırsan buna ihtiyacın olacak.

+0

* Neden * getCount() öğesi 0 döndürüyor? Daha iyi bir cevap vermek için lütfen detaylandırın. –

+0

Kurguda 'fragmentPageMap' oluşturulduğundan ve' getCount() 'çağrıldığında boştur. getCount() '' getItem (index) 'den önce çağrılır. Bunu hata ayıklayıcısında kontrol edebilirsiniz. – rubenlop

+0

Teşekkür ederiz! 0 döndürme konusunda haklısınız. Ancak, değerin kodlanmış olması gerektiğini düşünmüyorum, parçalara dinamik olarak ekleme/çıkarma işlemini yapmak istiyorum. Anahtar deyim var çünkü yakında daha fazla parça eklenecek. – Nath5