我想要一个分页布局,其中每个页面都是一个带有项目列表的片段。数据来自单个调用中的 Web 服务,并将被分隔(例如,按关键字)到一个或多个列表中。
我的尝试是使用 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);
}