各ページがアイテムのリストを持つフラグメントであるページレイアウトが必要です。データは 1 回の呼び出しで Web サービスから取得され、1 つまたは複数のリストに (たとえば、キーワードで) 分割されます。
私の試みはViewPagerを使用して「マネージャー」を作成することでした:
class PagesManager extends FragmentPagerAdapter
(配列)アダプターのリストとフラグメントのリストがあります。フラグメントは次のインスタンスです。
class Page extends SherlockListFragment implements OnScrollListener
コンストラクターで:
public Page(PagesManager manager, int id)
もちろん、FragmentInstantiationException を引き起こすのはどれか。他の方法で参照と ID をページに渡し、コンストラクターを空のままにすることはできますが、アダプターで notifyDataSetChanged() を呼び出しても、リストは再描画されません。私の質問は、異なるプロパティを持つ同じ Fragment クラス (ViewPager のページ数はカスタマイズ可能である必要があります) の複数のインスタンスを、システムが再インスタンス化した後に構成を復元できるようにするにはどうすればよいですか? これは一般的すぎるかもしれませんが、私の問題は設計であると感じています。回転時にフラグメントが破棄された後、またはアプリがバックグラウンドに長時間ある場合を除いて、正常に動作するコードがあります。
編集 これはアダプターです:
public class DiscoverListAdapter extends ArrayAdapter<String> {
private final Context context;
private DiscoverPagesManager manager;
private int id;
public DiscoverListAdapter(Context context, DiscoverPagesManager manager, int id) {
super(context, R.layout.note_item);
this.context = context;
this.manager = manager;
this.id = id;
}
@Override
public int getCount() {
return manager.pageGetCount(id);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// load up the stuff
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.note_item, parent, false);
// now fill it up
Note note = manager.pageGetNote(id, position);
((TextView) rowView.findViewById(R.id.note_item_displayname))
.setText(note.getUser().getUsername());
return rowView;
}
}
マネージャーでフラグメントを作成します。
public DiscoverPagesManager(Context context, FragmentManager fm) {
super(fm);
pages = new ArrayList<Fragment>();
pages.add( new SearchPage() );
adapters = new ArrayList<DiscoverListAdapter>();
adapters.add(null);
notes = new ArrayList<List<Note>>();
notes.add(null);
DiscoverPage page;
for(int i=1; i<titles.length; i+=1) {
page = new DiscoverPage(this, i);
this.pages.add( page );
this.adapters.add( new DiscoverListAdapter(context, this, i) );
this.notes.add(null);
}
と
@Override
public Fragment getItem(int position) {
return this.pages.get(position);
}