Sto tentando di utilizzare un viewpager per visualizzare diversi frammenti. Al momento ho solo un singolo frammento ma sembra che non venga mai istanziato. Ho provato a utilizzare pager.setCurrentItem (0) ma il metodo getItem nell'adattatore non viene mai chiamato. Qualcuno capisce perché il mio frammento non sta caricando nel codice qui sotto?ViewPager + Frammenti - Frammento non mostrato
Main Activity
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 layout
<?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();
}
}
Frammento layout
<?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>
Grazie, Nathan
Soluzioni attuali:
Cambiato l'adattatori costruttore per inizializzare il primo frammento e aggiungerlo alla mappa interna. Qualcuno vede qualcosa di sbagliato nel fare questo o un modo per migliorare il codice pubblicato sopra? Grazie!
public MyPagerAdapter(FragmentManager fm, Activity context) {
super(fm);
fragmentPageMap = new SparseArray<Fragment>();
SherlockListFragment scheduleFragment = ScheduleListFragment.newInstance();
fragmentPageMap.put(0, scheduleFragment);
}
* Perché * pensi che getCount() restituisca 0? Si prega di elaborare per rendere una risposta migliore. –
Poiché 'fragmentPageMap' viene creato nel costruttore ed è vuoto quando viene chiamato' getCount() '. 'getCount()' viene chiamato prima di 'getItem (index)'. Puoi verificarlo nel debugger. – rubenlop
Grazie! Hai ragione nel restituire 0. Tuttavia, non penso che il valore debba essere hardcoded, voglio essere in grado di aggiungere/rimuovere i frammenti in modo dinamico. L'istruzione switch è lì perché presto saranno aggiunti altri frammenti. – Nath5