2015-10-08 3 views
1

Я создал набор горизонтальных вкладок, и для каждого содержимого вкладки есть пейджер View, который, в свою очередь, позволяет просматривать содержимое представления.Android FragmentStatePagerAdapter - Отсутствует вид

В настоящее время я привязываю это к 3 видам в адаптере и возвращаю новый внутренний фрагмент, который представляет деталь, когда вызывается getItem().

Это работает нормально, пока я не перейду к другой вкладке, и когда я вернусь, средний вид отсутствует, это происходит на всех вкладках.

Когда я смотрю на отладку, я только когда-либо вижу вызов getItem для позиций 0 и 2, всегда есть представление, которое отсутствует, и поэтому вместо визуализированного представления у меня просто нет макета, если я прокручиваю, я получаю Другая точка зрения.

Если я не нажимаю на другую вкладку, но просто продолжаю прокручивать просмотры на вкладке, которая является значением по умолчанию, тогда я не теряю представление, похоже, только когда я нажал, чтобы перейти на другую вкладку, а затем обратно , Я никогда не видел запрос для просмотра в позиции 1, хотя, только когда-либо 0 или 2.

мой адаптер внутренний класс фрагмента, который представляет ViewPager и выглядит как:

public class HomeAddressDetailFragmentStatePageAdapter extends FragmentStatePagerAdapter { 

    public HomeAddressDetailFragmentStatePageAdapter(FragmentManager fragmentManager) { 
     super(fragmentManager); 
    } 

    @Override 
    public int getCount() { 
     return 3; 
    } 

    @Override 
    public android.support.v4.app.Fragment getItem(int position) { 
     Log.d(LOG_TAG, "requesting tab view in position: " + position); 
     android.support.v4.app.Fragment fragment = null; 

     fragment = new HomeAddressDetailFragment(); 

     return fragment; 
    } 
} 

The OnCreate для фрагмент:

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View rootView = (View)inflater.inflate(R.layout.fragment_home_addresses, container, false); 
    HomeAddressDetailFragmentStatePageAdapter homeAddressDetailFragmentStatePageAdapter = new HomeAddressDetailFragmentStatePageAdapter(getFragmentManager()); 
    homeAddressViewPager = (ViewPager)rootView.findViewById(R.id.home_addr_pager); 
    homeAddressViewPager.setAdapter(homeAddressDetailFragmentStatePageAdapter); 

    return rootView; 
} 

И XML для этого фрагмента:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 
    <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/home_addr_pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_weight="1"> 

    </android.support.v4.view.ViewPager> 
</FrameLayout>  

ответ

2

Это, г EFAULT. FragmentStatePagerAdapter хранит два загруженных фрагмента в любое время.

В вашем случае:

  • позиции 0 и 1

ИЛИ

  • позиции 1 и 2.

Значение фрагмента в положении 1 всегда прежде чем».

Вы можете (потому что у вас есть 3 фрагмента), скажите ваш ViewPager, чтобы загрузить более двух фрагментов, в то время

homeAddressViewPager.setOffscreenPageLimit(2); 

Таким образом, ваши фрагменты не будет перезагружен (по умолчанию offScreenPageLimit установлен в 1).

setOffscreenPageLimit(int number)

Установите количество страниц, которые должны быть сохранены в обе стороны от текущей страницы в иерархии вид в неактивном состоянии.

Но ...было бы лучше, чтобы сохранить фрагменты состояния, когда адаптер не нужен, и перезагрузить его, когда он становится видимым (например, с помощью onSaveInstanceState)

UPDATE:

, как Рассматриваются: ваш рабочий поток будет что-то вроде этого. Вы отправляете запрос на получение всех адресов, анализируете их в ArrayList, и каждый фрагмент должен быть представлением одной записи из вашего ArrayList.

Лучшим способом было бы передать ваш проанализированный ArrayList на адаптер, а при вызове getItem() передать запись ArrayList в комплект (чтобы вы могли получить к нему доступ в своем фрагменте).

public class HomeAddressDetailFragmentStatePageAdapter extends FragmentStatePagerAdapter { 
    private ArrayList<Address> arrayListAddress; 

    public HomeAddressDetailFragmentStatePageAdapter(FragmentManager fragmentManager, ArrayList<Address> arrayList) { 
     super(fragmentManager); 
     arrayListAddress = arrayList; 
    } 

    @Override 
    public int getCount() { 
     return arrayListAddress.size(); 
    } 

    @Override 
    public android.support.v4.app.Fragment getItem(int position) { 
     Bundle bundle = new Bundle(); 
     bundle.putSerializable("address", arrayListAddress.get(position)); 

     android.support.v4.app.Fragment fragment = new HomeAddressDetailFragment(); 
     fragment.setArguments(bundle); 

     return fragment; 
    } 
} 
+0

Хорошо хорошо мой следующий барьер будет раздвинуть вкладки с сетевым вызовом, чтобы захватить реальную nmber адресов, а затем зафиксировать его в этом, поэтому я должен всегда установить метод выше 1 меньше числа элементов в моем арифметике адресов? – berimbolo

+0

Также если opsition 1 всегда есть, почему он не отображает фактический макет представления? – berimbolo

+0

На самом деле было бы лучше, если бы я мог попросить пейджер представления не поддерживать какие-либо представления, которые, как я предполагаю, каждый раз, когда запрашивается представление, я могу просто захватить данные из массива для этой позиции позиции и затем визуализировать данные. это плохая идея? – berimbolo