0

我正在嘗試將項目加載到我的MainActivity工具欄內的微調器中。在MainActivity中有一個名爲HomeFragment的片段。該片段包含SlidingTabLayout,一旦我點擊不同的標籤,我需要將不同的數據集加載到上述微調器。關於使用排球庫將項目加載到微調器

這裏是如何看起來像:

enter image description here

我已經實現內部MainActivity方法將數據添加到微調:

public void addItemsToSpinner(final Collection<String> collection) { 

     ArrayList<String> list = new ArrayList<>(); 
     list.addAll(collection); 

     CustomSpinnerAdapter spinAdapter = new CustomSpinnerAdapter(getApplicationContext(), list); 
     subCategories_spinner.setAdapter(spinAdapter); 
     subCategories_spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 

      @Override 
      public void onItemSelected(AdapterView<?> adapter, View v, int position, long id) { 
       // On selecting a spinner item 
       String item = adapter.getItemAtPosition(position).toString(); 

       // Showing selected spinner item 
//    Toast.makeText(getApplicationContext(), "Selected : " + item, 
//      Toast.LENGTH_SHORT).show(); 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> arg0) { 
       // TODO Auto-generated method stub 

      } 
     }); 

    } 

而且在我的HomeActivity我有設置爲OnPageChangeListerSlidingTabLayout如下:

mTabs.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
      @Override 
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
       if (firstScrolled) { 
        // Here log-cat gives me I/Position: On page scrolled - 0 which means on stating app this line executed. But data not set to the spinner. 
        // Log.i("Position", "On page scrolled - " + position); 
        volleySubCatFilter("women"); 
        ((MainActivity) getActivity()).addItemsToSpinner(subs);//debug console subs (ArrayList) size given as 0 here 
        firstScrolled = false; 
       } 


      } 

      @Override 
      public void onPageSelected(int position) { 
       if (position == 0) { 
        // Log.i("Position", "On page selected - " + position); 
        volleySubCatFilter("women"); 
        ((MainActivity) getActivity()).addItemsToSpinner(subs); 

       } 
       if (position == 1) { 
        // Log.i("Position", "On page selected - " + position); 
        volleySubCatFilter("men"); 
        ((MainActivity) getActivity()).addItemsToSpinner(subs); 

       } 
       if (position == 2) { 
        // Log.i("Position", "On page selected - " + position); 
        volleySubCatFilter("household%20goods"); 
        ((MainActivity) getActivity()).addItemsToSpinner(subs); 

       } 
      } 

      @Override 
      public void onPageScrollStateChanged(int state) { 

      } 
     }); 

使用volleySubCatFilter("category_here");方法我從服務器抽取數據,並且它工作正常。

我的問題是第一次加載應用程序WOMEN選項卡中選擇是和,但沒有數據加載到spinner.But我試着用Log.i("Position", "On page scrolled - " + position);,一旦應用程序加載它給了我在我的日誌貓I/Position: On page scrolled - 0但數據不會加載。 調試線((MainActivity) getActivity()).addItemsToSpinner(subs)講述0個項目。一旦按下另一個選項卡,則開始加載屬於上一個選項卡的數據。例如: - 按男子選項卡右後應用程序加載獲取數據屬於女子選項卡。然後我點擊任何製表符開始加載數據屬於WOMEN選項卡。

如果我簡要說明這個問題,數據加載到微調器後面是一步 。

enter image description here

這將不勝感激,如果有人給我建議的方式來提前擺脫這一bug.Thanks的。

回答

2

您需要提供連續的步驟爲你的數據在background thread加載。當你選擇一個頁面時,你有兩個選擇。

1.啓動或者是Synchronous Volley call並在Activity這個調用

RequestFuture<JSONObject> future = RequestFuture.newFuture(); 
JsonObjectRequest request = new JsonObjectRequest(URL, null, future, future); 
requestQueue.add(request); 

try { 
    JSONObject response = future.get(); // this will block (forever) 
    ArrayList<String> some_items = response.getStringArray(); 
    //update the spinner with new items 

} catch (InterruptedException e) { 
    // exception handling 
} catch (ExecutionException e) { 
    // exception handling 
} 

2.更新後的微調適配器註冊一個BroadcastReceiver,然後通過sendBroadcastLocalBroadcastManagerVolleyResponse。並更新廣播接收器的onReceive中的微調項目

希望這會有所幫助。

0

我不確定這是一個錯誤或功能,最初pagechangelistener沒有被稱爲應用程序啓動的情況下。它會在您切換選項卡後被調用。我希望您在代碼中進行一些更改:

在Activity中編寫您希望在方法中執行的功能,然後在onPageSelected方法中調用此方法。

mTabs.setOnPageChangeListener(new OnPageChangeListener() { 
    @Override 
    public void onPageSelected(int index) { 
     if (position == 0) { 
        // Log.i("Position", "On page selected - " + position); 
        volleySubCatFilter("women"); 
        ((MainActivity) getActivity()).addItemsToSpinner(subs); 

       } 
       if (position == 1) { 
        // Log.i("Position", "On page selected - " + position); 
        volleySubCatFilter("men"); 
        ((MainActivity) getActivity()).addItemsToSpinner(subs); 

       } 
       if (position == 2) { 
        // Log.i("Position", "On page selected - " + position); 
        volleySubCatFilter("household%20goods"); 
        ((MainActivity) getActivity()).addItemsToSpinner(subs); 

       } 
    } 
    ... 
} 

然後在活動呼籲

setCurrentItem(index); 

之後,添加if語句

if(index == 0) { 
    volleySubCatFilter("women"); 
         ((MainActivity) getActivity()).addItemsToSpinner(subs); 
} 
+0

我試過了。但無法解決問題。 –

0

請通過下面的步驟如下:

  1. 創建界面:

public interface Updateable { public void update(); }

  • 實現上面在ViewPager片段接口。

  • 在你PagerAdapter類,重寫getItemPosition(Object object)

  • `公衆詮釋getItemPosition(Object對象){

    if (object instanceof ManFragment) { 
         ManFragment f = (ManFragment) object; 
         f.update(); 
        } else if (object instanceof WomanFragment) { 
         WomanFragment f = (WomanFragment) object; 
         f.update(); 
        } 
        else if (object instanceof HouseFragment) { 
         HouseFragment f = (HouseFragment) object; 
         f.update(); 
        } 
    
        return super.getItemPosition(object); 
    }` 
    
  • 現在你的片段的update()方法提供更新工具欄中的微調器數據的邏輯。可以通過在片段的OncreateView中提供更新方法中的invalidateOptionMenu()setHasOptionsMenu(true)來完成。工具欄微調器數據更新可以通過執行onPrepareOptionsMenu(Menu menu)覆蓋方法來完成。

  • 在您卡Page滾動邏輯,通知適配器:

  • @Override public void onPageScrollStateChanged(int state) { yourAdapter.notifyDataSetChanged(); }

    相關問題