2015-11-30 3 views
0

Я хочу создать soemthing так:Фрагмент с ViewPager выпуска

enter image description here

ViewPager прилагается к адаптеру, который имеет 2 фрагмента. Один, чтобы указать предстоящие заказы, а другой - список прошлых заказов.

Таким образом, изображение, показанное выше, имеет основной фрагмент, на котором размещен ViewPager, и адаптер создает 2 фрагмента в виде дочерних элементов основного фрагмента.

Для простоты я буду называть основной фрагмент в качестве «фрагмента Родителя» и два фрагмента, поставляемого адаптер, «детей фрагментов».

После того, как родительский фрагмент создан или возобновлен, он должен получить список данных с сервера и передать его фрагменту двух детей (фрагменты детей будут обрабатывать список данных и отображать необходимые данные). Оба дочерних фрагмента имеют listView, и каждый элемент строки listView доступен для просмотра.

Теперь данные, полученные родительским фрагментом, должны быть переданы фрагментам детей до присоединения ViewPager к адаптеру. Поэтому я не прикрепляю адаптер к ViewPager в методе onCreate родительского фрагмента, но, как только список данных будет извлечен, я присоединяю адаптер к ViewPager в методе onPostExecute async-задачи после того, как данные будут извлечены.

Это работает отлично в первый раз, но как только я нажимаю на элемент listView дочернего фрагмента, а затем нажимаю кнопку «Назад», метод getItem() адаптера не вызывается, а методы onResume для детей фрагменты вызываются еще до того, как данные будут получены с сервера.

Итак, я предполагаю, что андроидная структура помнит, что фрагмент детей уже создан и не воссоздает их снова.

Как обеспечить, чтобы фрагменты детей создавались/вызывались только после того, как данные были получены с сервера в родительском фрагменте?

Я добавление кода для ясности.

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.Java (Дети Фрагменты)

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 метод i использует запрос волейбола и в методе onResponse i обновляю данные, а затем добавляю вкладки:

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

Смежные вопросы