2017-03-02 27 views
0

所有選項卡有一個頁面適配器,我叫活動, 它有3個標籤,每個標籤調用Web服務,以充分填充ListView控件。此外,我在每個標籤中都有一個sharedpreference。我如何不加載FragmentStatePagerAdapter

問題是,當我從索引訪問頁面時,花了很長時間並在日誌中說貓「我/編舞:跳過了633幀!應用程序可能在其主線程上做了太多工作「。

我認爲它的,因爲它們的加載在同一時間在3選項卡,所以它使這一進程更加艱難。有沒有什麼辦法只在我點擊該選項卡時才加載選項卡?

頁適配器類

public class PagerAdapter extends FragmentStatePagerAdapter { 
int mNumOfTabs; 
private Context context; 
public PagerAdapter(FragmentManager fm, int NumOfTabs) { 
    super(fm); 
    this.mNumOfTabs = NumOfTabs; 
} 

@Override 
public Fragment getItem(int position) { 

    switch (position) { 
     case 0: 
      MyRequest myReq = new MyRequest(); 
      return myReq; 
     case 1: 
      ListApproval myApp = new ListApproval(); 
      return myApp; 
     case 2: 
      ListApprovalHistory myAppHis = new ListApprovalHistory(); 
      return myAppHis; 
     default: 
      return null; 
    } 
} 

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

列表活動:

public class Workflow extends AppCompatActivity{ 
private static String URLService; 
private static final String ARG_SECTION_NUMBER = "section_number"; 
private static String userId; 
private static String DirectSuperiorName; 
private static String rowsPerPage; 
private static SharedPreferences pref; 

boolean _areLecturesLoaded = false; 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.workflow_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 



     TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); 
     tabLayout.addTab(tabLayout.newTab().setText("My Request")); 
     tabLayout.addTab(tabLayout.newTab().setText("My Approval")); 
     tabLayout.addTab(tabLayout.newTab().setText("My Approval History")); 
     tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 

     final ViewPager viewPager = (ViewPager) findViewById(R.id.pager); 
     final PagerAdapter adapter = new PagerAdapter 
       (getSupportFragmentManager(), tabLayout.getTabCount()); 
     viewPager.setAdapter(adapter); 
     viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
     viewPager.setOffscreenPageLimit(0); 
     tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
      @Override 
      public void onTabSelected(TabLayout.Tab tab) { 
       viewPager.setCurrentItem(tab.getPosition()); 
      } 

      @Override 
      public void onTabUnselected(TabLayout.Tab tab) { 

      } 

      @Override 
      public void onTabReselected(TabLayout.Tab tab) { 

      } 
     }); 
    URLService = getString(R.string.URLService); 
    getSuperior(); 
    //GET SESSION USERID 
    pref = getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE); 
    userId = pref.getString("userId", ""); 
    rowsPerPage = pref.getString("rowsPerPage",""); 
    DirectSuperiorName = pref.getString("DirectSuperiorName",""); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu_workflow, menu); 
    return true; 
} 


@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     // Respond to the action bar's Up/Home button 
     case android.R.id.home: 

      Intent intent = new Intent(this, Index.class); 
      startActivity(intent); 
      return true; 
     case 0: 
      getSuperior(); 
      if(DirectSuperiorName != "") { 
       SharedPreferences.Editor editor = pref.edit(); 
       editor.putString("PageType", "NewRequest"); 
       editor.commit(); 
       Intent i = new Intent(Workflow.this, WorkflowActivity.class); 
       startActivity(i); 
      } 
      else 
      { 
       AlertDialog.Builder builder2 = new AlertDialog.Builder(this); 
       builder2.setMessage("Cannot create new request, Please set DirectSuperior !") 
         .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int id) { 
          } 
         }); 
       builder2.create(); 
       builder2.show(); 
      } 
      return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 



@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    menu.add(Menu.NONE,0,0,"Create New").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 
    /*if(DirectSuperiorName != ""){ 
     menu.add(Menu.NONE,0,0,"Create New").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 
    } 
    else{ 
     menu.clear(); 
    }*/ 
    return super.onPrepareOptionsMenu(menu); 
} 


@Override 
public void onBackPressed() { 
    Intent i = new Intent(this, Index.class); 
    startActivity(i); 
    super.onBackPressed(); 
} 
} 

這是我的片段孩子代碼:

public class ListApproval extends android.support.v4.app.Fragment { 
private static final String ARG_SECTION_NUMBER = "section_number"; 
private static String userId; 
private static String rowsPerPage; 
private SwipeRefreshLayout swipeContainer; 
private List<ListApprovalItem> mItems; 
private ListApprovalItem item; 
private static SharedPreferences pref; 
private Handler mHandler; 
private static String URLService; 
private String Enc_Pass=""; 
private boolean isDataLoaded; 

// TODO: Rename and change types of parameters 
public static ListApproval newInstance(int sectionNumber) { 
    ListApproval fragment = new ListApproval(); 
    Bundle args = new Bundle(); 
    args.putInt(ARG_SECTION_NUMBER, sectionNumber); 
    fragment.setArguments(args); 
    return fragment; 
} 


public ListApproval() { 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_item_list_approval, container, false); 
    setHasOptionsMenu(true); 

    this.mHandler = new Handler(); 
    this.mHandler.postDelayed(getData,500); 
    URLService = getString(R.string.URLService); 
    Enc_Pass = getString(R.string.password_encryption); 
    //GET SESSION USERID 
    pref = getActivity().getApplicationContext().getSharedPreferences("MyPref", getActivity().MODE_PRIVATE); 
    userId = pref.getString("userId", ""); 
    rowsPerPage = pref.getString("rowsPerPage",""); 

    final ListView lv = (ListView) view.findViewById(R.id.lvApproval); 
      lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
        new BigProccess(getActivity(), ProgressDialog.STYLE_SPINNER).execute(); 
        item = new ListApprovalItem(); 
        item = mItems.get(position); 
        SharedPreferences.Editor editor = pref.edit(); 
        editor.putString("PermitID", item.permitid); 
        editor.putString("PageType", "MyApproval"); 
        editor.putString("LeaveType", item.tipe); 
        editor.commit(); 

        Intent i = new Intent(getActivity(), WorkflowActivity.class); 
        getActivity().startActivity(i); 
       } 
      }); 

    getApprovalList(); // i call my api here , when oncreateview start 

    if (mItems==null) 
    { 
     /* Toast.makeText(getActivity().getApplicationContext(), "Internet connection appears to be offline", 
       Toast.LENGTH_LONG).show();*/ 

    } 
    else 
    { 
     lv.setAdapter(new ListApprovalAdapter(getActivity(), mItems)); 
    } 
    swipeContainer = (SwipeRefreshLayout) view.findViewById(R.id.swipeContainer); 
    swipeContainer.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
     @Override 
     public void onRefresh() { 
      getApprovalList(); 

      if (mItems==null) 
      { 
       /* Toast.makeText(getActivity().getApplicationContext(), "Internet connection appears to be offline", 
         Toast.LENGTH_LONG).show();*/ 

      } 
      else 
      { 
       lv.setAdapter(new ListApprovalAdapter(getActivity(), mItems)); 
      } 
      swipeContainer.setRefreshing(false); 
     } 
    }); 
    return view; 
} 


@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == 0) { 
     /* SharedPreferences.Editor editor = pref.edit(); 
     editor.putString("PageType", "ApprovalHistory"); 
     editor.commit(); 

     Fragment newFragment = ListApprovalReimbursementHistory.newInstance(6); 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     ft.addToBackStack(null); 
     ft.replace(R.id.flApproval, newFragment).commit();*/ 

    } 

    return super.onOptionsItemSelected(item); 
} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    // getActivity().getMenuInflater().inflate(R.menu.index, menu); 
    super.onCreateOptionsMenu(menu, inflater); 
} 

@Override 
public void onPrepareOptionsMenu(Menu menu) { 
// menu.clear(); 
    // menu.add(Menu.NONE,0,0,"History").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 
    super.onPrepareOptionsMenu(menu); 
} 






private final Runnable getData = new Runnable() { 
    @Override 
    public void run() { 
     getApprovalList(); 
    } 
}; 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    // remove the dividers from the ListView of the ListFragment 
    //getListView().setDivider(null); 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 

} 

}

我不知道哪裏是問題, 你們能幫我嗎? 任何幫助將感激

+0

@覆蓋 公衆詮釋getCount將(){ 回報mNumOfTabs; }更改此return返回1 –

+0

或者嘗試viewpager的offScreenLimit設置爲1個 –

回答

0

的一種方法是重寫的FragmentsetUserVisibleHint方法 -
添加一段代碼,你應該怎麼做,

public class ListApproval extends android.support.v4.app.Fragment { 

    private boolean isDataLoaded; 

    public static ListApproval newInstance(int sectionNumber) { 
     ListApproval fragment = new ListApproval(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_SECTION_NUMBER, sectionNumber); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_item_list_approval, container, false); 
     setHasOptionsMenu(true); 

     // Do your UI related stuffs here... 

     return view; 
    } 

    /* 
    * Set a hint to the system about whether this fragment's UI is currently visible to the user. 
    */ 
    @Override 
    public void setUserVisibleHint(boolean isVisibleToUser) { 
     super.setUserVisibleHint(isVisibleToUser); 
     // isDataLoaded is to prevent multiple calls 
     if (isVisibleToUser && !isDataLoaded) { 
      loadData(); // Make an api call to bind data into your list 
      isDataLoaded = true; 
     } 
    } 
} 

更多setUserVisibleHint()Click here

+0

嘿感謝的答案,但在那裏我可以把行代碼?在我看來是尋呼機還是在我的活動? – gilllsss

+0

在你的'Fragment'即'MyRequest','ListApproval'和'ListApprovalHistory'在你的代碼。我提到的意見那邊如果還有任何混淆,請點擊鏈接,你將被重定向到Android的官方文檔。 – Wizard

+0

但我在oncreateview中調用我的API服務(只要片段開始),它會在setuservisibilehint()中工作嗎? – gilllsss

相關問題