2

ViewPager の最初のページとして新しいビューを追加したいと考えています。私のアダプターは次のようになります。

public class PagerAdapter extends FragmentPagerAdapter {

    private final List<Fragment> fragments;

    public PagerAdapter(FragmentManager fm, List<Fragment> fragments) {
        super(fm);
        this.fragments = fragments;
    }

    @Override
    public Fragment getItem(int index) {
        return fragments.get(index);
    }

    @Override
    public int getCount() {
        return fragments.size();
    }

    public void add(int i, ImageFileObject imageFile) {
        ImageViewFragment f = new ImageViewFragment();
        f.setImage(imageFile);
        fragments.add(0, f);
        notifyDataSetChanged();
    }

    public void add(ImageFileObject imageFile) {
        ImageViewFragment f = new ImageViewFragment();
        f.setImage(imageFile);
        fragments.add(f);
        notifyDataSetChanged();
    }

}

しかし、add(0, aImageFile) を呼び出すと、アイテムはフラグメント リストの前に追加されません。(追加すらされていません)。

何か案は?

4

2 に答える 2

2

更新:コメントで説明した問題は本当です。最初のテストでは見逃していました。のソース コードを分析した後、異なるフラグメント アイテムに対して同じ ID を返さない方法でオーバーライドFragmentPagerAdapterするだけでよいことがわかりました。たとえば、現在のデフォルトの実装は、この場合には機能しないフラグメントの ID として位置を返すだけです。getItemId()

 public long getItemId(int position) {
    return position;
}

この回答を更新しています。ご覧ください。以前と同様に、このコードをテストしましたが、あなたが説明した問題は現在発生していません。


必要なのは、フラグメントの参照を で自分で保持しないことだけです。Listこれは、 によって自動的に行われますFragmentPagerAdapter。そして、私が知る限り、それも良い習慣ではありません。また、他の回答で示唆されているように戻ったとしても、例外が発生しPOSITION_NONEますgetItemPosition()

原因: java.lang.IllegalStateException: フラグメントのタグを変更できません。

これは、フラグメントを 0 番目のインデックスに追加して (他のフラグメントの位置を変更する原因となります)、位置に基づいてタグを割り当てることによってFragment、あなたの中に alive の位置を変更しようとしているためです。ListViewPager

これらすべてを念頭に置いて、テスト済みで機能する変更されたアダプターを次に示します。

public class PagerAdapter extends FragmentPagerAdapter {
public static class FragmentInfo {
    public String classz;
    public ImageFileObject imageFile;


    public static long IDS;
    public long id;

    public FragmentInfo(){
        id = IDS++;
    } 
}



private final List<FragmentInfo> fragments;
private Context context;

public PagerAdapter(FragmentManager fm, List<FragmentInfo> fragments,
        Context context) {
    super(fm);
    this.fragments = fragments;
    this.context = context;
}

@Override
public Fragment getItem(int index) {
    FragmentInfo info = fragments.get(index);
    ImageViewFragment frag = (ImageViewFragment) Fragment.instantiate(
            context, info.classz, /* null arguments*/ null);
    frag.setImage(info.imageFile);
    return frag;
}

@Override
public long getItemId(int position) {
    return fragments.get(position).id;
} 

@Override
public int getCount() {
    return fragments.size();
}

@Override
public int getItemPosition(Object object) {
    return POSITION_NONE;
}

public void add() {
    FragmentInfo f = new FragmentInfo();
    f.classz = ImageViewFragment.class.getName();
    fragments.add(0, f);
    notifyDataSetChanged();
}
}

それに応じてコードを変更してください。

于 2013-10-09T16:44:13.497 に答える
0

問題は実際には notifyDataSetChanged にあります。アダプターに追加するだけです:

public int getItemPosition(Object object) {
    return POSITION_NONE;
}

ただし、アダプターが実際に再度呼び出そうとすると、他の問題が発生すると思いますgetItem。これらの問題は、「Fragment Already added」の行にあります。

于 2013-10-09T14:51:12.507 に答える