2017-01-24 5 views
0

В моем приложении для Android я использую TabLayout с FragmentStatePagerAdapter, чтобы показать динамически сгенерированные фрагменты. Он показывает правильные фрагменты в первый раз, но, возвращаясь к тем, которые уже просмотрены и не являются соседними, отображается пустая страница ...TabLayout показывает пустой фрагмент, второй раз

Я изучил это и, кажется, два способ фиксации этого:

  • Использование FragmentStatePagerAdapter вместо FragmentPagerAdapter, что я уже сделал, и это ничего не меняет.

  • Изменить
    adapter = new FragmentStatePagerAdapter(*getSupportFragmentManager*());
    в:
    adapter = new FragmentStatePagerAdapter(*getChildFragmentManager*());
    , что я не могу сделать, потому что я в AppCompatActivity и этот метод в Fragment ...

Есть ли способ решить эту проблему, не расширив эту деятельность из FragmentActivity, которая ввергла бы что-то в моем проекте?

Код:

private class SubsPagerAdapter extends FragmentStatePagerAdapter { 

    private final ArrayList<Fragment> fragmentsList = new ArrayList<>(); 
    private final ArrayList<String> titleList = new ArrayList<>(); 

    SubsPagerAdapter(FragmentManager manager) { 
     super(manager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return fragmentsList.get(position); 
    } 

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

    void addFragment(Fragment fragment, String title) { 
     fragmentsList.add(fragment); 
     titleList.add(title); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return titleList.get(position); 
    } 

    @Override 
    public Parcelable saveState() { 
     return null; 
    } 
} 

Реализация:

subsPager = (ViewPager) findViewById(R.id.subsPager); 
         tabLayout = (TabLayout) findViewById(R.id.tabs_view); 

subsPager.setAdapter(adapter); 
tabLayout.setupWithViewPager(subsPager) 

Edit - фрагмент кода:

public class PostsListFragment extends Fragment { 

private ArrayList<CustomPost> posts; 

private Sorting sorting; 

private String name; 
private RecyclerView recyclerView; 
private SubPostsAdapter adapter; 
private LinearLayoutManager linearLayoutManager; 
private Fetcher fetcher 

public PostsListFragment() { 
    this.posts = new ArrayList<>(); 
} 

public static Fragment newInstance(String name) { 
    PostsListFragment pf = new PostsListFragment(); 
    pf.name = name; 

    return pf; 
} 

@Override 
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    recyclerView = (RecyclerView) inflater.inflate(R.layout.posts_list_holder, container, false); 

    //default sorting 
    this.sorting = Sorting.HOT; 
    this.fetcher = new Fetcher(name); 

    loadItems(); 

    return recyclerView; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 
    setHasOptionsMenu(true); 
} 

private void loadItems() { 
    if (posts.size() == 0) { 
     new Thread() { 
      @Override 
      public void run() { 
       posts.addAll(fetcher.fetchPosts(sorting)); 

       new Thread() { 
        @Override 
        public void run() { 
         linearLayoutManager = new LinearLayoutManager(recyclerView.getContext()); 

         adapter = new SubPostsAdapter(posts, getActivity()); 

         getActivity().runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           recyclerView.setLayoutManager(linearLayoutManager); 
           recyclerView.setAdapter(adapter); 
          } 
         }); 

        } 
       }.start(); 
      } 
     }.start(); 
    } 
} 
} 
+0

Что значит «показывает пустую страницу»? 1) Вы воссоздаете фрагмент в любой точке? 2) можете ли вы показать код фрагмента примера, с которым это происходит? Показ ViewPager вызывает полный жизненный цикл фрагмента, поэтому, если он пуст и собирается загружать данные, он сделает это позже. –

+0

Фрагмент - это только recyclerview, который отображает текст/изображения, загруженные с url на основе строки имени , –

+0

Ваша проблема: 'pf.name = name' устанавливается как null, когда вы переходите к фрагменту. Это не то, как установить переменные экземпляра в Fragments –

ответ

0

Это был глупее, то это выглядело, убрав эту строку:

if (posts.size() == 0) { 

от loadItems в Фрагменте, делает его работу по назначению. Спасибо за cricket_007 за советы!