2017-01-24 7 views
0

私のAndroidアプリケーションでは、TabLayoutFragmentStatePagerAdapterを使って、動的に生成されたフラグメントを表示しています。 最初に正しくフラグメントが表示されますが、既に表示されているものに戻って隣接するものに戻ったときに空白のページが表示されます...TabLayoutは空白の部分を示します.

私はこれを調べましたが、

  • FragmentStatePagerAdapter代わりにFragmentPagerAdapterを使用して、私はすでにやった、それは何も変更しなかった。これを固定する方法。私はAppCompatActivity中だと、この方法は断片であるので、私が行うことができない...

が方法はあり
adapter = new FragmentStatePagerAdapter(*getChildFragmentManager*());
:へ

  • 変更
    adapter = new FragmentStatePagerAdapter(*getSupportFragmentManager*());
    私のプロジェクトで他のものを取り締まる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'がヌルとして設定されます。インスタンス変数をフラグメントに設定する方法ではありません –

    答えて

    0

    それはもっと愚かだった、それはこの行を削除し、見て:

    if (posts.size() == 0) { 
    
    フラグメント内のloadItemsからの

    は、意図したとおりに動作します。 アドバイスのためにcricket_007に感謝します!

    関連する問題