0

各ページがアイテムのリストを持つフラグメントであるページレイアウトが必要です。データは 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);
}
4

1 に答える 1

1

私はあなたがこれを間違っていると思います。FragmentPagerAdapterは、フラグメントの処理をページとして管理するという1つのことと1つのことだけを行うものとして考える必要があります。さて、フラグメントアダプタに追加するフラグメントには、それ自体、内部のデータを処理するアダプタがありますが、それはそれらの懸念がまったく交差する必要があるという意味ではありません。FragmentPagerAdapterにFragmentsを追加するだけです。次に、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 に答える