ViewPager と Spinner を使用したアクティビティがあり、Spinner でアイテムを選択してすべてのページのコンテンツを変更したいだけです。より完全に理解するために、説明します。単純な TV スケジュールの毎週の番組を開発しているので、ページは毎日のテレビ番組で、スピナーはテレビチャンネルです。番組を起動すると、すべてのチャンネルの短い 4 項目の番組リストが表示され、スピナーで「CNN」または他のものを選択すると表示されます。ページが表示されている日の完全なテレビ番組リストを表示します(TitlePageIndicatorを使用する日を表示するために)、私の問題は、スピナーでアイテムを選択し、データをロードして
notifydatasetchanged()を呼び出したときです私のFragmentStatePagerAdapterの場合-ページを更新しません。私が間違っていることを理解していませんか?
マイアダプター
private class TVProgrammFragmentAdapter extends FragmentStatePagerAdapter {
private FragmentManager fm;
private ArrayList<TVProgrammFragment> mFragments;
public TVProgrammFragmentAdapter(FragmentManager fm, ArrayList<TVProgrammFragment> mFragments) {
super(fm);
this.fm = fm;
this.mFragments = mFragments;
}
public CharSequence getPageTitle(int position) {
return ((TVProgrammFragment) mFragments.get(position)).getTitle();
}
public Fragment getItem(int arg0) {
return mFragments.get(arg0);
}
public int getCount() {
return mFragments.size();
}
// I don't know wherefore this line
// It is a first issue that I've googled
// And it's useless
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
MyActivity onCreate のコード
mAdapter = new TVProgrammFragmentAdapter(getSupportFragmentManager(), new ArrayList<TVProgrammFragment>());
mPager = (ViewPager) findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
mIndicator = (TitlePageIndicator) findViewById(R.id.indicator);
mIndicator.setTopPadding(0);
mIndicator.setSelectedBold(true);
mIndicator.setViewPager(mPager);
mSpinner = (Spinner) findViewById(R.id.spinner);
mSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long arg3) {
if (mChannelIndex != position) {
String param = position == 0 ? String.valueOf(mTVProgrammAdapter.dates.get(mPager.getCurrentItem()).date) : String.valueOf(mTVProgrammAdapter.dates.get(mPager.getCurrentItem()).date) + "/" + String.valueOf(mTVProgrammAdapter.channels.get(position).id);
//Problems are here -->
setParamsToPages(param);
//<--
mChannelIndex = position;
}
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
getTVProgrammDatesChannels();
そして、これがアプリの起動後にデータを取得する方法です
//LoadHelper it is a class which does all data-loading things from server API
//And it works perfectly with any problems
LoadHelper.getTVProgrammDatesAndChannels(new OnLoadFinishedListener() {
@Override
public void onLoadFinished(final Object obj) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mTVProgrammAdapter = ((TVProgrammAdapter) obj);
mTVProgrammAdapter.channels.add(0, new TVProgrammChannel("-1", ALL_CHANNELS));
mTVChannelsAdapter = new ChannelsAdapter(mTVProgrammAdapter.channels);
mSpinner.setAdapter(mTVChannelsAdapter);
//Setting a pages for a dates
for (TVProgrammDate date : mTVProgrammAdapter.dates) {
TVProgrammFragment tvFragmemnt = new TVProgrammFragment();
tvFragmemnt.setArguments(date);
((TVProgrammFragmentAdapter) mPager.getAdapter()).mFragments.add(tvFragmemnt);
}
((TVProgrammFragmentAdapter) mPager.getAdapter()).notifyDataSetChanged();
mViewFlipper.setDisplayedChild(1);
}
});
}
そして、ここに私の問題があります-setParamsToPagesメソッドです
public void setParamsToPages(final String param) {
new Thread(new Runnable() {
@Override
public void run() {
final ArrayList<TVProgrammFragment> fragments = ((TVProgrammFragmentAdapter) mPager.getAdapter()).mFragments;
//Here I setting a new fragments with new params to
//TVProgrammFragmentAdapter fragments ArrayList(mFragments)
for (TVProgrammFragment tvFragmemnt : fragments) {
TVProgrammFragment newFragment = new TVProgrammFragment();
String title = tvFragmemnt.getTitle();
newFragment.setArguments(title, param);
fragments.set(fragments.indexOf(tvFragmemnt), newFragment);
}
runOnUiThread(new Runnable() {
@Override
public void run() {
//doesn't do anything
mAdapter.notifyDataSetChanged();
//mAdapter still displaying an "old"
//fragments
}
});
}
});
}