そのため、ローダー API で FragmentStatePagerAdapter を使用しようとすると、この問題が発生しましたが、UI に値が設定されていません。つまり、onLoadFinished() が完了し、値が TextView、ImageView、および changeCursor に設定されていることを意味します。 XML で設定したとおりの UI が表示されます。
問題を明確に説明できるかどうか見てみましょう。
リストがあり、アイテムをタップすると詳細ビューが表示されます。アイテムが選択されると、ids 配列と選択されたアイテムの位置の 2 つの要素が詳細に送信されます。
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
Intent intent = new Intent(ActionConstant.DETAIL);
intent.putExtra("ids", ids);
intent.putExtra("position", position);
startActivity(intent);
}
});
したがって、DetailActivity には、ID と位置を使用して適切なデータをロードする FragmentStatePagerAdapter を持つ ViewPager があります。
@Override
public void onCreate(Bundle savedIntanceState) {
super.onCreate(savedIntanceState);
setContentView(R.layout.detail);
ids = getIntent().getLongArrayExtra("ids");
int currentIndex = getIntent().getIntExtra("position",-1);
mPagerAdapter = new DetailPagerAdapter(getSupportFragmentManager());
// Set up the ViewPager, attaching the adapter.
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mPagerAdapter);
mViewPager.setCurrentItem(currentIndex);
}
そして、DetailPagerAdapter オーバーライド getItem と getCount (ids.length を返す)
@Override
public Fragment getItem(int i) {
return DetailFragment.newInstance(ids[i]);
}
DetailFragment では、newInstance がこれを行います
public static DetailFragment newInstance(long id) { DetailFragment f = new DetailFragment();
// Supply num input as an argument.
Bundle args = new Bundle();
args.putLong("_id", id);
f.setArguments(args);
return f;
}
および onLoadFinished が呼び出されたとき。
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if (loader.getId() == 1)
adapter.changeCursor(cursor);
else if (loader.getId() == 2) {
if (!cursor.moveToNext())
return;
textName.setText(cursor.getString(cursor.getColumnIndexOrThrow(TraderColumns.NAME)));
}
}