gpt4 book ai didi

android - 如何将 Fragment 添加到 FragmentPagerAdapter 中的第一个位置

转载 作者:行者123 更新时间:2023-12-04 00:32:48 25 4
gpt4 key购买 nike

我正在使用 FragmentPagerAdapter 和 ViewPager 添加自定义 fragment 编辑:从我的 MainActivity(还通过 bundle 发送基于 JSON 响应的一堆额外数据)并使用滑动 Action 移动到列表中的下一个 fragment 。

public class MyPagerAdapter extends FragmentPagerAdapter implements Serializable {

public List<Fragment> fragments;
public FragmentManager fm;

public MyPagerAdapter(FragmentManager fm) {
super(fm);
this.fm = fm;
this.fragments = new ArrayList<Fragment>();
}

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


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

}

只要我添加新的 Fragments 一切正常使用

MyPagerAdapter pageAdapter = new MyPagerAdapter(getSupportFragmentManager());

pager = (ViewPager)findViewById(R.id.myViewPager);

pageAdapter.fragments.add(new CustomFragment());

pager.setAdapter(pageAdapter);

但我找不到合适的方法将 fragment 添加到列表的开头并向后滑动。

我都试过了

pageAdapter.fragments.add(0, new CustomFragment());

以及将 FragmentPagerAdapters 列表更改为 LinkedList 并使用

pageAdapter.fragments.addFirst(new CustomFragment());

然后使用刷新适配器

pageAdapter.notifyDataSetChanged();

我不断收到以下异常:

java.lang.IllegalStateException: Can't change tag of fragment CustomFragment{2ead9520 #10 id=0x7f0a0002 android:switcher:2131361794:10}: was android:switcher:2131361794:10 now android:switcher:2131361794:11

最佳答案

目前还没有人谈到的关键方法是 public int getItemPosition(Object),它用于在 fragment 移动后将 fragment 重新映射到页面,以及 public long getItemId(int position),它必须被重新排序 fragment 的寻呼机适配器覆盖。默认实现使用页面的位置作为 id,因此重新排序会混淆 FragmentPagerAdapter

(我省略了 Serializable 接口(interface),因为它与回答问题无关 - How to reorder fragments in a FragmentPagerAdapter)。

public class MyPagerAdapter extends FragmentPagerAdapter {

public List<Fragment> fragments;
public FragmentManager fm;

public MyPagerAdapter(FragmentManager fm) {
super(fm);
this.fm = fm;
this.fragments = new ArrayList<Fragment>();
}

void addFragmentAtPosition(int position, Fragment f) {
if(position == fragments.size())
fragments.add(f);
else
fragments.add(position, f);
notifyDataSetChanged();
}

void removeFragmentAtPosition(int position) {
Fragment f = fragments.remove(position);
if(f != null)
fm.beginTransaction().remove(f).commit();
notifyDataSetChanged();
}

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

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

@Override
public int getItemPosition(Object object){
/*
* called when the fragments are reordered to get the
* changes.
*/
int idx = fragments.indexOf(object);
return idx < 0 ? POSITION_NONE : idx;
}

@Override
public long getItemId(int position) {
/*
* map to a position independent ID, because this
* adapter reorders fragments
*/
return System.identityHashCode(fragments.get(position));
}
}

主要的添加是对 public int getItemPosition(Object)public long getItemId(int) 的覆盖。这些允许 FragmentPagerAdapter 重新定位现有 fragment 并正确识别 FragmentManager 缓存中的现有 Activity fragment 。

关于android - 如何将 Fragment 添加到 FragmentPagerAdapter 中的第一个位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27381116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com