0

我想要一个分页布局,其中每个页面都是一个带有项目列表的片段。数据来自单个调用中的 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);
}
4

1 回答 1

1

我认为你做错了。您需要将 FragmentPagerAdapter 视为只做一件事且仅做一件事:将 Fragment 的处理作为页面进行管理。现在,恰好是您添加到 Fragment 适配器的 Fragment 本身具有处理其中数据的适配器,但这并不意味着这些问题应该完全交叉。您只需将片段添加到您的 FragmentPagerAdapter。然后,在您的 ListFragments 内部,它们将由它们自己的适配器支持。换句话说,管理ArrayList<DiscoverListAdapter>()PagerAdapter 的内部是一个很大的禁忌。DiscoverListAdapter 应该在各个片段的 onCreateView 上的 onCreate 中创建。

编辑:

FragmentPagerAdapter 中的 getItem 将适配器中的位置传递给您。您需要将该数据绑定到片段。使用这样一个简单、干净的模式:

public class MyFragment extends Fragment {
 private int mPosition;
public static MyFragment newInstance(int position) {
   MyFragment fragment = new MyFragment();
   Bundle bundle = new Bundle();
   bundle.putInt("position", position);
   fragment.setArguments(bundle);
   return fragment;
}

public void onCreate(Bundle savedState) {
  super.onCreate(savedState);
  Bundle data = getArguments();
  mPosition = data.getInt("position");
  //do something based on position

}
}

//在您的 PagerAdapter 中:

@Override
public Fragment getItem(int position) {
    return MyFragment.newInstance(position);
}
于 2012-11-18T04:05:42.583 回答