Intereting Posts
Ndk-stack: невозможно открыть файл символа … /../ libutil.so. Ошибка (9): неправильный дескриптор файла Перенаправить содержимое файла с android на компьютер Android – Как наложить один путь поверх другого Почему не доступна библиотека поддержки Android версии 22? Увеличивает ли notifydatasetchchange вызов onCreateViewHolder при использовании RecyclerView Ввод оболочки ADB в определенном каталоге на подключенном устройстве с использованием только одной строки кода терминала Невозможно опубликовать обновленный APK: «Версия 20 не поддерживается какой-либо конфигурацией устройства» Неправильно ли использовать несколько фоновых служб в одном приложении для Android? Что такое uri, contentValues Почему я не могу купить собственное приложение на рынке Android? Как сохранить ExpandableListView в расширенном состоянии? Загрузите большой файл с индикатором выполнения и без ошибки OutOfMemory в Android Пример дизайна патчей для панели инструментов Android Всегда показывать заголовок маркера карты в Android Невозможно удалить повторяющиеся элементы из arraylist hashmap

ViewPager + Fragments – Фрагмент не показан

Я пытаюсь использовать viewpager для отображения нескольких фрагментов. На данный момент у меня есть только один фрагмент, но кажется, что он никогда не создается. Я попытался использовать pager.setCurrentItem (0), но метод getItem в адаптере никогда не вызывается. Кто-нибудь видит, почему мой фрагмент не загружается в приведенном ниже коде?

Основная деятельность

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 в MyPagerAdapter поэтому Fragment не будет создан, он должен вернуть 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; }