【问题标题】:Not able to update middle fragment in View Pager.无法更新 View Pager 中的中间片段。
【发布时间】:2017-10-10 04:14:15
【问题描述】:

我一直在研究带有 3 个选项卡的 TAB 布局。

我的问题是 我无法更新,刷新页面之间滑动的第二个标签。

根据我的调试 我从第一个选项卡滑动到第二个,第三个在 getItem(int position) 调用,类似的片段一个被称为从第三个选项卡滑动到第二个。

viewpager 的默认 getOffscreenPageLimit1。我什至无法将其设置为零计数。

在getItem,一开始的位置是1,但是当我滑动页面时, 它只调用位置 0 和 2。 1 永远不会被调用。

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

这是我的 ViewPagerSetUp

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new 
ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new InvitedFragment(), "Invited");
    adapter.addFragment(new InterestedFragment(), "Interested");
    adapter.addFragment(new AttendingFragment(), "Attending");
    viewPager.setAdapter(adapter);
}

这是我的 ViewPager

 class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

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

    public void refreshFragment(int position) {
        mFragmentList.get(position).onResume();
    }

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

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

addOnPageChangeListener 是一种选择,但我也无法使用 pageChangelistener 刷新它。

如何解决 offscreenpagelimit 问题? 如何在每次页面滑动时刷新每个标签?

谢谢。

【问题讨论】:

    标签: java android android-fragments android-viewpager fragment


    【解决方案1】:

    试试这个,

    在fragment中重写下面的方法。它在fragment可见时调用

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
            //do your Stuffs
        }
    }
    

    【讨论】:

    • 因为 setUserVisibleHint 一开始就执行了,所以我也必须添加 isResumed。感谢 Pradeep 的建议。 if (isVisibleToUser && isResumed()) { //做你的事情 }
    • if (isVisibleToUser &amp;&amp; isResumed()) 你救了我的命,你能编辑你的答案吗@PradeepGupta
    【解决方案2】:

    将此添加到您的活动中

      viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    
            }
    
            @Override
            public void onPageSelected(int position) {
                viewPager.getAdapter().notifyDataSetChanged();
            }
    
            @Override
            public void onPageScrollStateChanged(int state) {
    
            }
        });
    

    在你的适配器中添加这个,

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

    【讨论】:

      【解决方案3】:

      如果未添加,则必须将 View Pager 添加到 tabLayout 中,然后尝试以下代码:

       tabLayout.setupWithViewPager(viewPager); 
      

      你也在 refreshFragment 方法中调用 Parent Fragment(super) onResume 方法,你必须调用 SubFragment onResume 方法:

          mInvitedFragment.onResume();
          mInterestedFragment.onResume();
          mAttendingFragment.onResume();
      

      【讨论】:

        【解决方案4】:

        您可以使用以下方法刷新第二个片段。将此方法放入片段中。

        @Override
            public void setUserVisibleHint(boolean visible) {
                super.setUserVisibleHint(visible);
                if (visible) {
                    //   load data here
                }else {
                    // fragment is no longer visible
                }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多