2016-06-01 15 views
1

各メニュー項目のフラグメントを使用するナビゲーション・ドロワー付きのアプリがあります。
アイテムがクリックされるたびに、私は現在のフラグメントを置き換えます。ナビゲーション・ドロワー・フラグメント間の変更が遅い

問題は、ユーザーがクリックした後に新しいフラグメントが表示されるのに時間がかかり、問題が発生することです。 ロードに最も長くかかるフラグメントは、その中にタブを持ち、子フラグメント(1つのフラグメントにRecyclerViewが含まれています)を持つフラグメントです。
フラグメントの読み込み速度を上げる方法はありますか? (これが可能であるならば、おそらく、事前にそれらを初期化?)ここで

は私のコードです:

protected override void OnCreate(Bundle bundle) 
    { 
     drawerLayout = FindViewById<DrawerLayout>(Resource.Id.drawer_layout); 
     navigationView = FindViewById<NavigationView>(Resource.Id.nav_view); 
     drawerLayout.DrawerClosed += DrawerLayout_DrawerClosed; 


     navigationView.NavigationItemSelected += (sender, e) => 
     { 
      e.MenuItem.SetChecked(true); 
      //react to click here and swap fragments or navigate 

      switch (e.MenuItem.ItemId) 
      { 
       case (Resource.Id.nav_home): 
        ListItemClicked(0); 
        break; 

       case (Resource.Id.nav_halachot): 
        ListItemClicked(1); 
        break; 

       case (Resource.Id.nav_times): 
        ListItemClicked(2); 
        break; 

       case (Resource.Id.nav_siddur): 
        ListItemClicked(3); 
        break; 
       case (Resource.Id.nav_compass): 
        ListItemClicked(4); 
        break; 

       case (Resource.Id.nav_settings): 
        ListItemClicked(5); 
        break; 
      } 


      drawerLayout.CloseDrawers();     
     }; 

     if (bundle == null) 
     { 
      ListItemClicked(0); 
      navigationView.Menu.GetItem(0).SetChecked(true); 
      fragment = new HomeFragment(); 
      SupportFragmentManager.BeginTransaction() 
      .Replace(Resource.Id.content_frame, fragment) 
      .Commit(); 
     } 
    } 

public override void OnBackPressed() 
    { 

     if (drawerLayout.IsDrawerOpen((int)GravityFlags.Start)) 
     { 
      drawerLayout.CloseDrawer((int)GravityFlags.Start); 
     } 
     else 
     { 
      base.OnBackPressed(); 
     } 
    } 

    private void ListItemClicked(int position) 
    { 

     switch (position) 
     { 
      case 0: 
       fragment = new HomeFragment(); 
       Title = "Home"; 
       SupportActionBar.Elevation = 8; 
       break; 
      case 1: 
       fragment = new HalachaFragment(); 
       Title = "aaa"; 
       SupportActionBar.Elevation = 0; 
       break; 
      case 2: 
       fragment = new TimesFragment(); 
       Title = "bbb"; 
       SupportActionBar.Elevation = 8; 

       break; 
      case 3: 
       fragment = new SiddurFragment(); 
       Title = "ccc"; 
       SupportActionBar.Elevation = 8; 
       break; 
      case 4: 
       fragment = new CompassFragment(); 
       Title = "ddd"; 
       SupportActionBar.Elevation = 8; 
       break; 
      case 5: 
       fragment = new SettingsFragment(); 
       Title = "eee"; 
       break; 
     } 



    } 

    private void DrawerLayout_DrawerClosed(object sender, DrawerLayout.DrawerClosedEventArgs e) 
    { 
     SupportFragmentManager.BeginTransaction() 
      .Replace(Resource.Id.content_frame, fragment).AddToBackStack("BACK") 
      .Commit(); 

    } 

HalachaFragment.cs(タブを含む断片):誰かができ

public class HalachaFragment : Fragment 
{ 
    private ViewPager halachotPager; 
    private PagerSlidingTabStrip tabs; 

    public HalachaFragment() 
    { 
     this.RetainInstance = true; 
    } 
    public override void OnCreate(Bundle savedInstanceState) 
    { 
     base.OnCreate(savedInstanceState); 

     // Create your fragment here 
    } 

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     // Use this to return your custom view for this Fragment 

     var view = inflater.Inflate(Resource.Layout.HalachaSection, container, false); 

     var fragments = new Android.Support.V4.App.Fragment[] 
     { 
      new HalachotFragment(), 
      new BooksFragment(), 
     }; 

     var titles = CharSequence.ArrayFromStringArray(new[] 
     { 
       "הלכות", 
       "ספרים", 
     }); 

     halachotPager = view.FindViewById<ViewPager>(Resource.Id.halachotPager); 

     halachotPager.Adapter = new TabsFragmentPagerAdapter(this.ChildFragmentManager, fragments, titles); 
     halachotPager.OffscreenPageLimit = 2; 
     halachotPager.SetCurrentItem(1, true); 
     // Bind the tabs to the ViewPager 
     tabs = view.FindViewById<PagerSlidingTabStrip>(Resource.Id.halachotTabs); 

     tabs.SetViewPager(halachotPager); 

     return view; 

    } 
} 

・ホープ助けて。

ありがとうございました。

答えて

0

thisを参照してください。フラグメントの子を読み込むためにスレッドを使用するだけです。あなたのonItemClickを変更するとき。

layoutDrawer.closeDrawer(linearDrawer); 
setLastPosition(posicao); 
new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      setFragmentList(lastPosition); 
     } 
    }, 0); 
関連する問題