6

Ich verwende https://github.com/mikepenz/MaterialDrawer als Bibliothek für Schublade, und ich verwende https://github.com/florent37/MaterialViewPager für View Pager.Verzögerung beim Ersetzen des ViewPager-Fragments in der Navigationsleiste über FrameLayout?

Das Problem, mit dem ich konfrontiert bin, ist, dass ich ein bisschen Verzögerung (Art von Stottern Lag) konfrontiert, wenn ich auf Listenelement in meiner Schublade und das Schließen der Drwawer, wonach das Fragment ersetzt wird. Ich sehe das in einem Fragment, das ein ViewPager ist, ist ein Fragment.

see the image

Activity(which has NavBar): 

public class mvpAct extends AppCompatActivity { 
private RelativeLayout mRelativeLayout; 
public static List<Model_Slots> list; 
private Drawer result; 
private static GetDetails gd; 
public static List<Model_Daywise> todayslist_m; 
public static List<Model_Daywise> todayslist_t; 
public static List<Model_Daywise> todayslist_w; 
public static List<Model_Daywise> todayslist_th; 
public static List<Model_Daywise> todayslist_fr; 
public static List<detailattlist_subcode> detail_att_all = new ArrayList<>(); 
public static HashMap<String, List<DetailAtten>> hash = new HashMap<>(); 
public static List<AttendBrief> attendBriefs = null; 
public static List<Marks_Model> marks_det; 
public static List<PBL_Model> lpbl; 

public void setMTWTFLists(final Context ctxt) { 
    String mark = new SharedPrefs(ctxt).getMsg("marksdone").trim(); 
    String att = new SharedPrefs(ctxt).getMsg("ttdone").trim(); 
    String tt = new SharedPrefs(ctxt).getMsg("attendone").trim(); 
    Log.d("Done Value", mark + "\t" + att + "\t" + tt); 
    if (mark.equals("y") && att.equals("y") && tt.equals("y")) { 
     Log.d("Here", "naive"); 
     try { 
      new Thread(new Runnable() { 
       public void run() { 
        todayslist_m = new MTWTHgetset(ctxt, "monday").getAllCredentials(); 
        todayslist_t = new MTWTHgetset(ctxt, "tuesday").getAllCredentials(); 
        todayslist_w = new MTWTHgetset(ctxt, "wednesday").getAllCredentials(); 
        todayslist_th = new MTWTHgetset(ctxt, "thursday").getAllCredentials(); 
        todayslist_fr = new MTWTHgetset(ctxt, "friday").getAllCredentials(); 
       } 
      }).start(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 


} 

@Override 
public void onBackPressed() { 
    if (gd.isAdded()) 
     getSupportFragmentManager() 
       .beginTransaction().remove(gd).commit(); 
    else super.onBackPressed(); 

} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.drawer_frame_mvp); 
    gd = new GetDetails(); 
    if (savedInstanceState == null) { 
     getSupportFragmentManager().beginTransaction().add(R.id.mvp_frame_act, gd).commit(); 
    } 
    try { 
     list = new Slots_GetSet(this).getAllCredentials(); 
     String classnbrs[] = new String[list.size()]; 
     int r = 0; 
     for (Model_Slots ms : list) { 
      classnbrs[r++] = ms.getNumber().trim(); 
     } 
     for (int t = 0; t < classnbrs.length; t++) { 
      detailattlist_subcode dr = new detailattlist_subcode(); 
      hash.put(classnbrs[t], new IndivAttGetSet(this, " table_of_" + classnbrs[t]).getAllCredentials()); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    try { 
     attendBriefs = new Attend_GetSet(this).getAllCredentials(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    try { 
     marks_det = new CBL_Get_Set(this).getAllCredentials(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    try { 
     lpbl = new PBL_Get_Set(this).getAllCredentials(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     lpbl = new ArrayList<>(); 
    } 
    try { 
     setMTWTFLists(getApplication()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    PrimaryDrawerItem item1 = new PrimaryDrawerItem().withName("Slots").withIdentifier(1); 
    SecondaryDrawerItem item2 = new SecondaryDrawerItem().withName("ImageStudentLogin").withIdentifier(2); 
    result = new DrawerBuilder() 
      .withActivity(this) 
      .addDrawerItems(
        item1, 
        new DividerDrawerItem(), 
        item2, 
        new SecondaryDrawerItem().withName("Setup"), 
        new SecondaryDrawerItem().withName("Daywise") 
      ) 
      .withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() { 
       @Override 
       public boolean onItemClick(View view, int position, IDrawerItem drawerItem) { 
        displayView(position); 
        if (result.isDrawerOpen()) 
         result.closeDrawer(); 
        return true; 
       } 
      }) 
      .build(); 

} 


private void displayView(int position) { 
    Fragment fragment = null; 
    switch (position) { 
     case 0: 
      String s = getSharedPreferences("sp", Context.MODE_PRIVATE).getString("own", "no"); 
      if (s.equals("already")) { 
       fragment = new Fragment_slots(); 
      } else if (s.equals("yes")) { 
       list = new Slots_GetSet(getApplicationContext()).getAllCredentials(); 
       fragment = new Fragment_slots(); 
      } else if (s.equals("no")) { 
       fragment = new GetDetails(); 
      } 
      break; 
     case 2: 
      fragment = new Photo_Stu(); 
      break; 
     case 3: 
      fragment = new GetDetails(); 
      break; 
     case 4: 
      fragment = MaterialVPFrag.newInstance(); 
      break; 
     default: 
      fragment = MaterialVPFrag.newInstance(); 
      break; 
    } 
    if (fragment != null) { 
     FragmentManager fm = getSupportFragmentManager(); 
     fm.beginTransaction().replace(R.id.mvp_frame_act, fragment).commit(); 
    } else { 
     Log.e("DrawerActivity", "Error creating fragment"); 
    } 
} 


} 

Fragment (wo I lag (Art von Stotter lag) in Verfahren des Schließens der Schublade Gesicht nach dem diese gegenüber anderen Rahmen ersetzt wird):

public class MaterialVPFrag extends Fragment { 
private MaterialViewPager mViewPager; 

public static MaterialVPFrag newInstance() { 
    return new MaterialVPFrag(); 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.mvp_layout, container, false); 

} 

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    mViewPager = (MaterialViewPager) view.findViewById(R.id.materialViewPager); 
    mViewPager.getViewPager().setAdapter(new FragmentStatePagerAdapter(getChildFragmentManager()) { 
     @Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 0: 
        return new RecyclerViewFragment(mvpAct.todayslist_m); 
       case 1: 
        return new RecyclerViewFragment(mvpAct.todayslist_t); 
       case 2: 
        return new RecyclerViewFragment(mvpAct.todayslist_w); 
       case 3: 
        return new RecyclerViewFragment(mvpAct.todayslist_th); 
       case 4: 
        return new RecyclerViewFragment(mvpAct.todayslist_fr); 
       default: 
        return new RecyclerViewFragment(mvpAct.todayslist_m); 
      } 
     } 

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

     @Override 
     public CharSequence getPageTitle(int position) { 
      switch (position) { 
       case 0: 
        return "Monday"; 
       case 1: 
        return "Tuesday"; 
       case 2: 
        return "Wednesday"; 
       case 3: 
        return "Thursday"; 
       case 4: 
        return "Friday"; 
      } 
      return ""; 
     } 
    }); 
    mViewPager.setMaterialViewPagerListener(new MaterialViewPager.Listener() { 
     @Override 
     public HeaderDesign getHeaderDesign(int page) { 
      switch (page) { 
       case 0: 
    return HeaderDesign.fromColorAndDrawable(getResources().getColor(R.color.colorPrimary), getResources().getDrawable(R.drawable.myback)); 
       case 1: 
        return HeaderDesign.fromColorResAndUrl(
          R.color.blue, 
          "http://cdn1.tnwcdn.com/wp-content/blogs.dir/1/files/2014/06/wallpaper_51.jpg"); 
       case 2: 
        return HeaderDesign.fromColorResAndUrl(
          R.color.cyan, 
          "http://www.droid-life.com/wp-content/uploads/2014/10/lollipop-wallpapers10.jpg"); 
       case 3: 
        return HeaderDesign.fromColorResAndUrl(
          R.color.red, 
          "http://www.tothemobile.com/wp-content/uploads/2014/07/original.jpg"); 
      } 
      return null; 
     } 
    }); 

    mViewPager.getViewPager().setOffscreenPageLimit(mViewPager.getViewPager().getAdapter().getCount()); //it works without it don't know why! 
    mViewPager.getPagerTitleStrip().setViewPager(mViewPager.getViewPager()); 
    mViewPager.getPagerTitleStrip().setBackgroundColor(Color.TRANSPARENT); 
    mViewPager.getPagerTitleStrip().setIndicatorColor(Color.RED); 
    mViewPager.getPagerTitleStrip().setTabBackground(Color.TRANSPARENT); 
    View logo = view.findViewById(R.id.logo_white); 
    if (logo != null) 
     logo.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mViewPager.notifyHeaderChanged(); 

      } 
     }); 

} 
} 

Inner Fragment of ViewPager:

public class RecyclerViewFragment extends Fragment { 
private RecyclerView mRecyclerView; 
public static RecyclerView.Adapter mAdapter; 
List<Model_Daywise> list; 

public RecyclerViewFragment() { 
} 

public RecyclerViewFragment(List<Model_Daywise> lis) { 
    list = lis; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.fragment_recyclerview, container, false); 
} 

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); 
    LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); 
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
    mRecyclerView.setLayoutManager(layoutManager); 
    mAdapter = new RecyclerViewMaterialAdapter(new CardAdapter_Daywise(list, getActivity())); 
    mRecyclerView.setAdapter(mAdapter); 
    MaterialViewPagerHelper.registerRecyclerView(getActivity(), mRecyclerView, null); 
} 
} 

Vielen Dank!

+0

Haben Sie die unten angegebene Verzögerung versucht? Oder können Sie ein Beispielprojekt für das Problem bereitstellen? – mikepenz

Antwort

2

Die neueste Version des MaterialDrawer kommt mit einer eingebauten Verzögerung von 50ms nach dem Abfeuern des Listener-Ereignisses, bevor die Schublade selbst geschlossen wird.

Wenn Sie ein komplexeres Verhalten beim Wechseln von Fragmenten haben, ist es sinnvoll, diese Verzögerung zu ändern und sie auf 150 ms oder sogar 250 ms zu ändern.

Dies kann über die Builder-Methode

withDelayOnDrawerClose(int delay) 

Wenn Sie die Schublade sofort die Fragmente Vermittlungs- und danach schließen möchten erfolgen sollten Sie die Verzögerung auf 0 ms gesetzt und einen Handler in der Schublade Artikel klicken Hörer hinzufügen

new Handler().postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     //your logic in here 
    } 
}, yourDelay); 
+0

Das Problem ist, dass es keine Verzögerung (Stutter) für ein einfaches Fragment gibt (zB habe ich 4 EditText und einen Button), aber es passiert für die oben genannte MaterialVPFrag.class (ViewPager im Fragment, Lag für etwa 0.8sec) und ein Fragment, das RecyclerView enthält (Verzögerung für ungefähr 0,5 Sekunden). –

+0

Hey, ich habe den Post bearbeitet und ein .gif des Problems hinzugefügt. –

+0

hast du die dinge versucht, die ich in meiner antwort gepostet habe. und fügen Sie etwas Verzögerung hinzu. Je komplizierter das Fragment ist, desto mehr Zeit braucht es für init. es wird also Verzögerung verursachen, weil die Benutzeroberfläche auf dem Hauptthread behandelt wird und dies die Animationen ebenfalls blockiert – mikepenz