2015-11-30 219 views
0

我想這樣創造soemthing:片段與ViewPager問題

enter image description here

的ViewPager連接到具有2個片段的適配器。一個列出即將到來的訂單,另一個列出過去的訂單。

所以上面顯示的圖片有一個主要的片段,它承載了ViewPager,並且適配器創建了2個片段作爲主要片段的子元素。

爲了簡單起見,我會打電話的主要片段作爲「父片段」和由適配器爲「兒童片段」提供的兩個片段。

一旦父段被創建或恢復,它必須從服務器獲取數據列表,並將其傳遞給兩個子段(子段將處理數據列表並顯示必要的數據)。這兩個子片段都有一個listView,並且每個listView行項目都是可點擊的。

現在,由父片段獲取的數據必須在ViewPager連接到適配器之前傳遞給子片段。因此,我不會將適配器附加到父代片段的onCreate方法中的ViewPager,而是一旦提取了數據列表,我就會在提取數據後將適配器附加到異步任務的onPostExecute方法中的ViewPager。

這工作正常,但第一次,但一旦我點擊子片段的listView行項目,然後按下後退按鈕,適配器的getItem()方法不會被調用,但兒童的onResume方法即使在從服務器獲取數據之前也會調用片段。

所以我猜android框架記得兒童片段已經被創建,並且不會再次重新創建它們。

如何確保子數據片段僅在父數據片段中的服務器中獲取數據後才創建/調用?

爲了清楚起見,我添加了一些代碼。

BookingHistory.java(父片段)

public class BookingHistory extends android.support.v4.app.Fragment { 
    ViewPager mPager; 
    SlidingTabLayout mTabs; 
    Toolbar toolBar; 
    View view; 

    private ProgressDialog progress; 
    private OrderTask mOrderTask = null; 
    UserFunctions userFunctions = null; 
    OrderFunctions orderFunctions = null; 
    private BookingHistoryListener mListener; 
    private List<Order> mOrderList; 

    PlacedOrders upcomingOrders; 
    PlacedOrders pastOrders; 

    public BookingHistory() { 
     // Required empty public constructor 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     mOrderList = null; 
     mPager = null; 
     mTabs = null; 
     upcomingOrders = null; 
     pastOrders = null; 
     progress = new ProgressDialog(getActivity()); 
     fetchOrders(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     view = inflater.inflate(R.layout.fragment_booking_history, container, false); 
     toolBar = (Toolbar) view.findViewById(R.id.toolbar_s); 
     if (toolBar != null) { 
      TextView tv = (TextView) view.findViewById(R.id.toolbar_title); 
      toolBar.setTitle(""); 
      tv.setText("History"); 
     } 
     return view; 
    } 

    class MyPagerAdapter extends FragmentPagerAdapter { 
     String tabs[] = {"Upcoming", "Past"}; 

     public MyPagerAdapter(android.support.v4.app.FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public android.support.v4.app.Fragment getItem(int position) { 
      if (position == 0) { 
       upcomingOrders = PlacedOrders.newInstance(Constants.DATE_TODAY_FUTURE); 
       upcomingOrders.getOrderList(mOrderList); 
       return upcomingOrders; 
      } else { 
       pastOrders = PlacedOrders.newInstance(Constants.DATE_PAST); 
       pastOrders.getOrderList(mOrderList); 
       return pastOrders; 
      } 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return tabs[position]; 
     } 

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

    public void fetchOrders() { 
     if (mOrderTask != null) { 
      return; 
     } 
     progress.show(); 
     mOrderTask = new OrderTask(getActivity()); 
     mOrderTask.execute((Void) null); 
    } 

    public class OrderTask extends AsyncTask<Void, Void, Boolean> { 

     private final Activity mActivity; 

     OrderTask(Activity activity) { 
      mActivity = activity; 
     } 

     @Override 
     protected Boolean doInBackground(Void... params) { 
      userFunctions = new UserFunctions(); 
      orderFunctions = new OrderFunctions(); 
      return orderFunctions.getList(userFunctions.getToken(mActivity)); 
     } 

     @Override 
     protected void onPostExecute(final Boolean success) { 
      mOrderTask = null; 
      progress.dismiss(); 
      if (success) { 
       mOrderList = UserProfile.getOrders(); 
       //attaching the view pager to adapter here! 
       mPager = (ViewPager) view.findViewById(R.id.pager); 
       mTabs = (SlidingTabLayout) view.findViewById(R.id.sliding_tabs); 
       mTabs.setDistributeEvenly(true); 
       mTabs.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() { 
        @Override 
        public int getIndicatorColor(int position) { 
         return getResources().getColor(R.color.white); 
        } 
       }); 
       mPager.setAdapter(new MyPagerAdapter(getChildFragmentManager())); 
       mTabs.setViewPager(mPager); 
      } else { 
       //Error handling stuff 
      } 
     } 
    } 
} 

PlacedOrders。爪哇(兒童片段)

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

    private static String flag; 
    private int dateFlag; 
    private PlacedOrdersListener mListener; 
    UserFunctions userFunctions = null; 
    OrderFunctions orderFunctions = null; 
    private PlacedOrdersAdapter ordersAdapter; 
    private ProgressDialog progress; 
    private List<Order> mOrderList; 
    private List<Order> mPendingOrderList; 
    private List<Order> mCompletedOrderList; 

    public static PlacedOrders newInstance(int date) { 
     PlacedOrders fragment = new PlacedOrders(); 
     Bundle args = new Bundle(); 
     args.putInt(flag, date); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    public void getOrderList(List<Order> orderList) { 
     this.mOrderList = orderList; 
    } 

    public PlacedOrders() { 
     // Required empty public constructor 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (getArguments() != null) { 
      dateFlag = getArguments().getInt(flag); 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     mPendingOrderList = new ArrayList<Order>(); 
     mCompletedOrderList = new ArrayList<Order>(); 
     return inflater.inflate(R.layout.fragment_placed_orders, container, false); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     displayOrders(); 
    } 

    private void displayOrders() { 
     if (isVisible() && (mOrderList != null)) { 
      mPendingOrderList.clear(); 
      mCompletedOrderList.clear(); 
      ListView listViewOrder = (ListView) getView().findViewById(R.id.orderList); 
      if(dateFlag == Constants.DATE_TODAY_FUTURE) { 
       for(int i = 0; i < mOrderList.size(); i++) { 
        String status = mOrderList.get(i).status; 
        if(status.equals("PENDING") || status.equals("PROCESSING")) { 
         mPendingOrderList.add(mOrderList.get(i)); 
         ordersAdapter = new PlacedOrdersAdapter(mPendingOrderList, getActivity().getLayoutInflater()); 
         listViewOrder.setAdapter(ordersAdapter); 
        } 
       } 
      } 
      else if(dateFlag == Constants.DATE_PAST) { 
       for(int i = 0; i < mOrderList.size(); i++) { 
        String status = mOrderList.get(i).status; 
        if(status.equals("COMPLETE")) { 
         mCompletedOrderList.add(mOrderList.get(i)); 
         ordersAdapter = new PlacedOrdersAdapter(mCompletedOrderList, getActivity().getLayoutInflater()); 
         listViewOrder.setAdapter(ordersAdapter); 
        } 
       } 
      } 

      listViewOrder.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       //Display a new fragment on clicking 
      }); 
     } 
    } 

} 
+0

也許你應該做的容器片段,**父**片段的片段成交,只有數據後活動被取出,如果它正在獲取顯示進度條或什麼? –

+0

是的,它應該工作,但不能按照我想要的方式完成嗎? – user3282666

回答

0

我有同樣的問題,這是我的解決方案: 在容器片段(片段包含標籤)在onViewCreated()方法我創建startFetch()方法:在

@Override 
    public void onViewCreated(View v, Bundle savedInstanceState) { 
     super.onViewCreated(v, savedInstanceState); 
     mViewPager = (ViewPager) v.findViewById(R.id.home_tab_pager); 
     mTabsHost= (TabLayout) getActivity().findViewById(R.id.appTabs); 
     startFetch(); 
    } 

然後startFetch方法我使用排球請求和在onResponse方法我更新數據,然後添加標籤:

public void startFetch(){ 
     //Create volley request 
     String url = BuildConfig.API_GET_CATEGORIES; 
     final RequestQueue queue = VolleyService.getInstance(this.getContext()).getRequestQueue(); 
     StringRequest request = new StringRequest(url, new Response.Listener<String>() { 

      @Override 
      public void onResponse(String response) { 
       // we got the response, now our job is to handle it 
       try { 
        updateCategoryData(response); 
       } catch (RemoteException | OperationApplicationException e) { 
        e.printStackTrace(); 
       } 
      } 
     }, new Response.ErrorListener() { 

      @Override 
      public void onErrorResponse(VolleyError error) { 
       //something happened, treat the error. 
       Log.e("ErrorFETCH", error.networkResponse.toString()); 
      } 
     }); 

     queue.add(request); 
    } 

udpateCategory()方法:

public void updateCategoryData(final String stream) throws RemoteException, OperationApplicationException { 
//Update the data to SQLITE 
setupTabs(); 
} 

setupTabs()方法:

public void setUpTabs(){ 
     ArrayList<Category> categories = new ArrayList<>(); 
     Cursor data = getActivity().getContentResolver().query(
       Category.Entry.CONTENT_URI, // URI 
       Category.PROJECTION,    // Projection 
       Category.Entry.COLUMN_NAME_PARENT_ID + " = ?", // Selection 
       new String[]{"0"},       // Selection args 
       null); 

     if (data != null) { 
      while(data.moveToNext()){ 
       categories.add(new Category(data)); 
      } 
     } 

     TabsPagerAdapter mAdapter = new TabsPagerAdapter(getActivity().getSupportFragmentManager(), this.getActivity(), categories); 
     mViewPager.setAdapter(mAdapter); 


     mTabsHost.setupWithViewPager(mViewPager); 
    } 
+0

我想你和我在這裏都做同樣的事情,除了你正在使用Volley,而我正在使用AsyncTask! – user3282666