关于使用 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);
}
请完成以下步骤:
- 创建界面:
public interface Updateable {
public void update();
}
在您的 ViewPager Fragments 中实现以上接口。
在您的 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);
}`
现在在片段的 update() 方法中,提供更新工具栏中微调器数据的逻辑。可以通过在片段的更新方法中提供 invalidateOptionMenu()
和在片段的 OncreateView 中提供 setHasOptionsMenu(true)
来完成。可以通过实施 onPrepareOptionsMenu(Menu menu)
覆盖方法来更新工具栏微调器数据。
在你的标签页面滚动逻辑中,通知适配器:
@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
上注册 sendBroadcast
到 LocalBroadcastManager
。并更新 BroadcastReceiver
的 onReceive 中的微调项
希望对您有所帮助。
我正在尝试将项目加载到我的 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);
}
请完成以下步骤:
- 创建界面:
public interface Updateable {
public void update();
}
在您的 ViewPager Fragments 中实现以上接口。
在您的 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);
}`
现在在片段的 update() 方法中,提供更新工具栏中微调器数据的逻辑。可以通过在片段的更新方法中提供
invalidateOptionMenu()
和在片段的 OncreateView 中提供setHasOptionsMenu(true)
来完成。可以通过实施onPrepareOptionsMenu(Menu menu)
覆盖方法来更新工具栏微调器数据。在你的标签页面滚动逻辑中,通知适配器:
@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
上注册 sendBroadcast
到 LocalBroadcastManager
。并更新 BroadcastReceiver
希望对您有所帮助。