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(); }

    相关问题