【问题标题】:Regarding loading items to the spinner using volley library关于使用 volley 库将项目加载到微调器
【发布时间】:2016-02-29 05:26:33
【问题描述】:

我正在尝试将项目加载到我的MainActivity 工具栏内的微调器。在MainActivity 内有一个名为HomeFragment 的片段。该片段包含SlidingTabLayout,一旦我单击不同的选项卡,我需要将不同的数据集加载到上述微调器。

这是它的样子:

我已经在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 中,我将OnPageChangeLister 设置为SlidingTabLayout,如下所示:

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 选项卡被选中,但没有数据加载到微调器。但我尝试使用Log.i("Position", "On page scrolled - " + position);,一旦应用程序加载它就会给我I/Position: On page scrolled - 0 在我的日志猫中。但是数据没有加载。 调试行((MainActivity) getActivity()).addItemsToSpinner(subs) 告诉 0 个项目。一旦我按下另一个选项卡,它就会开始加载属于前一个选项卡的数据。示例:- 在应用加载后立即按 MEN 选项卡获取属于 WOMEN 选项卡的数据。然后我点击它开始加载数据属于 WOMEN 的任何选项卡> 选项卡。

如果我简要介绍这个问题,将数据加载到微调器是一个步骤 后面。

如果有人建议我摆脱这个错误的方法,将不胜感激。在此先感谢。

【问题讨论】:

    标签: android android-fragments android-volley android-tablayout


    【解决方案1】:

    您需要在background thread 中加载数据时提供顺序步骤。当您选择一个页面时,您有两个选项。

    1.启动 Synchronous Volley call 并在此调用后更新微调器适配器

    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。在Activity 中注册BroadcastReceiver,然后在VolleyResponse 上通过LocalBroadcastManager 注册sendBroadcast。并更新 BroadcastReceiver 的 onReceive 中的微调项

    希望这会有所帮助。

    【讨论】:

    • 您应该引用该代码的source
    【解决方案2】:

    我不确定这是一个错误或功能,最初 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);
    

    在Activity中,添加如下if语句

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

    【讨论】:

      【解决方案3】:

      请执行以下步骤:

      1. 创建接口:

      public interface Updateable { public void update(); }

      1. 在您的 ViewPager Fragments 中实现上述接口。

      2. 在您的 PagerAdapter 类中,覆盖 getItemPosition(Object object)

      `public int getItemPosition(Object 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);
      }`
      
      1. 现在在片段的 update() 方法中,提供更新工具栏中微调器数据的逻辑。可以通过在更新方法中提供invalidateOptionMenu() 和在片段的 OncreateView 中提供setHasOptionsMenu(true) 来完成。工具栏微调器数据更新可以通过实现onPrepareOptionsMenu(Menu menu)覆盖方法来完成。

      2. 在你的标签页滚动逻辑中,通知适配器:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多