【问题标题】:Fragments in viewpager not working properlyviewpager 中的片段无法正常工作
【发布时间】:2017-05-17 15:39:15
【问题描述】:

我在 viewpager 中有 3 个选项卡,在所有 3 个片段中,我正在使用改造调用服务器,但是当我启动活动时,前 2 个片段被调用,并且从两个网络都被调用,当我去定位下一个选项卡时什么都没有显示,位置变为2。

问题是当我来到活动视图寻呼机已初始化并且寻呼机适配器返回位于位置 0 和 1 的两个片段并膨胀两者时,因此从两者都调用网络但是当我将选项卡移动到下一个位置时变为2...应该是 1。

适配器类:

public class PagerAdapter extends FragmentStatePagerAdapter {

private int mNumTabs;

    public PagerAdapter(FragmentManager fm, int numTabs) {
        super(fm);
        this.mNumTabs= numTabs;
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {

            case 0:
                Fragment1 tab0 = new Fragment1();
                return tab0;
            case 1:
                Fragment2 tab1 = new Fragment2();
                return tab1;
            case 2:
                Fragment3 tab2 = new Fragment3();
                return tab2;
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return mNumTabs;
    }

}

活动类:

public class UserProfileScreen extends AppCompatActivity {

    private ViewPager viewPager;
    private TabLayout tabLayout;
    private Context context;      
    private PagerAdapter PagerAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_profile_screen);
        context = this;
        initViews();
    tabLayout.addTab(tabLayout.newTab().setText("About"));
        tabLayout.addTab(tabLayout.newTab().setText("Session"));
        tabLayout.addTab(tabLayout.newTab().setText("Subjects"));
        pagerAdapter = new PagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
        viewPager.setAdapter(profilePagerAdapter);
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }
            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                //Toast.makeText(context, "Unselected",Toast.LENGTH_LONG).show();
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {
                //Toast.makeText(context, "Reselected",Toast.LENGTH_LONG).show();
            }
        });
    }

    private void initViews(){
        myToolbar = (Toolbar) findViewById(R.id.toolbar);
        tabLayout = (TabLayout) findViewById(R.id.profile_tab_layout);
        setSupportActionBar(myToolbar);
        viewPager = (ViewPager) findViewById(R.id.profile_viewPager);
    }

}

片段1:

public class Fragment1 extends Fragment {

    private RecyclerView sessions_recycler_view;
    private SessionsAdapter sessionsAdapter;
    private SessionProfileFragmentPresenter presenter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sessionsAdapter = new SessionsAdapter(getContext(),this);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_profile,container,false);

        sessions_recycler_view = (RecyclerView) view.findViewById(R.id.sessions_list);
        sessions_recycler_view.setAdapter(sessionsAdapter);

     //Server Call to get List<HashMap<String,Object>> data

      setDataToAdapter(data);

        return view;
    }


    private void setDataToAdapter(List<HashMap<String, Object>> sessions) {
        sessionsAdapter.setData(sessions);
    }

}

Fragment2 也与 Fragment1 相同。

【问题讨论】:

  • 发布你的尝试
  • 尝试使用 viewpager.setOffscreenPageLimit(3)

标签: android android-fragments


【解决方案1】:

我支持 Pramod Garg 的回答

viewPager 的默认 OffscreenPageLimit 为 1,因此以下代码可能对您有用。我刚刚添加了行 viewpager.setOffscreenPageLimit(2)。

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_profile_screen);
        context = this;
        initViews();
    tabLayout.addTab(tabLayout.newTab().setText("About"));
        tabLayout.addTab(tabLayout.newTab().setText("Session"));
        tabLayout.addTab(tabLayout.newTab().setText("Subjects"));
        pagerAdapter = new PagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
        viewPager.setAdapter(profilePagerAdapter);
        viewpager.setOffscreenPageLimit(2)
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }
            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                //Toast.makeText(context, "Unselected",Toast.LENGTH_LONG).show();
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {
                //Toast.makeText(context, "Reselected",Toast.LENGTH_LONG).show();
            }
        });
    }

【讨论】:

  • onCreate 活动 3 个片段将被加载而不是 2 个。
  • 我试过了,我在片段 3 中获取数据,但在片段 2 中没有
  • 所以问题可能出在 setDataToAdapter 上。
  • 片段 3 中的适配器被调用,但片段 2 中没有
  • 可以编辑帖子以获取有关片段的更多信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-13
相关资源
最近更新 更多