【问题标题】:FragmentStatePagerAdapter not refreshedFragmentStatePagerAdapter 未刷新
【发布时间】:2020-09-08 01:05:52
【问题描述】:

我有一个片段,其中包括几个使用 FragmentStatePagerAdapter 作为适配器的寻呼机。第一次创建片段时它工作正常。但是当我第二次创建片段时(例如当我切换选项卡时),FragmentStatePagerAdapter 根本没有更新。这是我的代码:

public class MyPagerAdapter extends FragmentStatePagerAdapter {

    private Activity m_activity;

    public MyPagerAdapter(Activity activity) {
        super(fm);

        m_activity = activity;
        refresh();
    }

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

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

    private void refresh() {

        m_fragments = new ArrayList<MyData>();

        // ......
        // after getting data from internet
        notifyDataSetChanged();

   }
}

我发现 getItem 是第一次调用。但是虽然refresh/getCount调用成功并且从互联网返回的数据也是正确的,但它没有第二次调用。

在 notifyDataSetChanged() 之后未调用 getItem() 的原因可能是什么?谢谢

P.S.:旋转设备就可以了。 getItem() 将被正确调用。

编辑:将使用此适配器的片段的代码。

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.home_fragment, container, false);

    // section 1
    m_sectionPager1 = (ViewPager)rootView.findViewById(R.id.sectionPager1);

    // section 2
    m_sectionPager2 = (ViewPager)rootView.findViewById(R.id.sectionPager2);

    return rootView;
}

@Override
public void onActivityCreated (Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    // 1
    m_section1Adapter = new MyPagerAdapter(this.getActivity());
    m_sectionPagerLatest.setAdapter(m_section1Adapter);

    // 2
    m_section2Adapter = new MyPagerAdapter(this.getActivity());
    m_sectionPagerHottest.setAdapter(m_section2Adapter);
}

【问题讨论】:

  • 有没有办法强制刷新 FragmentStatePagerAdapter?
  • 我不想说坏话。否决我的问题的人可以告诉我原因吗?

标签: android android-fragments


【解决方案1】:

将此代码添加到您的 FragmentStatePagerAdapter:

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

试试这个将重新创建片段。

【讨论】:

  • 已经试过了。不工作。这个方法也没有被调用。
  • 好的,那我想如果你能多加点代码,那我试试看问题出在哪里?
  • 我在片段(HomeFragment)中添加了代码,它将使用这个适配器。
【解决方案2】:

我在使用ViewPager2 时遇到了同样的问题,它没有getItemPosition 方法

解决方案是在FragmentStateAdapter 中覆盖方法getItemId

override fun getItemId(position: Int): Long {
    return data[position]?.id ?: 0
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多