2017-01-24 36 views
0

在我的Android應用我使用TabLayoutFragmentStatePagerAdapter,以顯示動態生成的片段。 它第一次顯示的片段正確,但當回到一些已經查看,並不是相鄰的它顯示一個空白頁...TabLayout顯示一個空白片段,第二時間

我已經看過這個,似乎有兩個這種固定方式:

  • 使用FragmentStatePagerAdapter代替FragmentPagerAdapter,我已經做了,並沒有改變任何東西。

  • 變化
    adapter = new FragmentStatePagerAdapter(*getSupportFragmentManager*());
    到:
    adapter = new FragmentStatePagerAdapter(*getChildFragmentManager*());
    ,我不能這樣做,因爲我在AppCompatActivity這種方法是在片段...

是否有辦法解決這個問題,而不會擴展這個活動的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) 

編輯 - 碎片代碼:

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

片段僅僅是基於名稱字符串顯示從URL下載文字/圖像recyclerview 。 –

+0

當你滑回片段時,你的問題是'pf.name = name'被設置爲null。這不是如何設置的實例變量片段 –

回答

0

這是比較笨的那看着,刪除這一行:

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

來自Fragment中的loadItems,使其按預期工作。 感謝cricket_007的建議!

相關問題