关于使用 volley 库将项目加载到微调器

Regarding loading items to the spinner using volley library

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

Here is how it looks like :

我已经在 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"); 方法,我从 volley 请求中检索数据到服务器,它工作正常。

我遇到的问题是第一次加载应用程序 WOMEN 选项卡被选中,但没有数据加载到 spinner.But 我试过 Log.i("Position", "On page scrolled - " + position); 和一旦应用程序加载,它就会在我的日志中显示 I/Position: On page scrolled - 0-cat.But 数据未加载。 调试行 ((MainActivity) getActivity()).addItemsToSpinner(subs) 告诉 0 items.Once 我按下另一个选项卡然后它开始加载属于前一个选项卡的数据。示例:- 在应用程序加载后立即按 MEN 选项卡获取数据属于 WOMEN tab.Then 我单击它开始加载数据所属的任何选项卡到 WOMEN 选项卡。

If I brief this problem data loading to the spinner is one step behind.

如果有人建议我提前摆脱这个 bug.Thanks 的方法,我将不胜感激。

我不确定最初 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);
}

请完成以下步骤:

  1. 创建界面:

public interface Updateable { public void update(); }

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

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

`public int getItemPosition(对象对象){

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

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

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 上注册 sendBroadcastLocalBroadcastManager。并更新 BroadcastReceiver

的 onReceive 中的微调项

希望对您有所帮助。