当我点击 TabLayout 的选项卡或通过 viewpager 移动时,我想加载片段
I want to load fragment when i click on tab of TabLayout or move by viewpager
我有多个片段,都显示一些新闻
问题是,当我 运行 我的应用程序加载所有片段并从服务器获取所有片段数据时,但我想在移动到该特定片段时获取数据,所以请帮助我
我的代码在下面
MainActivity.Java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setToolbar();
initView();
}
private void initView() {
TabLayout tabLayout=(TabLayout)findViewById(R.id.tablayout);
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
addTabs(tabLayout,viewPager);
BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
}
private void addTabs(TabLayout tabLayout, final ViewPager viewPager) {
final PageAdapter pageAdapter = new PageAdapter(getSupportFragmentManager(), 5);
tabLayout.addTab(tabLayout.newTab().setText(NewsConstant.HeadLines));
tabLayout.addTab(tabLayout.newTab().setText(NewsConstant.Sports));
tabLayout.addTab(tabLayout.newTab().setText(NewsConstant.Health));
tabLayout.addTab(tabLayout.newTab().setText(NewsConstant.India));
tabLayout.addTab(tabLayout.newTab().setText(NewsConstant.World));
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
viewPager.setAdapter(pageAdapter);
viewPager.setOffscreenPageLimit(5);
}
PageAdapter.java
public class PageAdapter extends FragmentStatePagerAdapter {
int mNumOfTabs;
public PageAdapter(FragmentManager fm, int NumOfTabs) {
super(fm);
this.mNumOfTabs = NumOfTabs;
}
@Override
public Fragment getItem(int position) {
return NewsFragment.newInstance(position,position+"");
}
@Override
public int getCount() {
return mNumOfTabs;
}
NewFragment.java
public class NewsFragment extends Fragment {
private RecyclerView recyclerView;
public static NewsFragment newInstance(int index,String title) {
NewsFragment fragment = new NewsFragment();
Bundle args = new Bundle();
args.putInt(NewsConstant.INDEX,index);
args.putString(NewsConstant.TITLE,title);
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_news_list, container, false);
initView(view);
getDataFromServer(); // Here i get data and display
return view;
}
例如。
我在Activity中使用TabLayout、ViewPager来加载Fragments
我有 3 个 TAB 喜欢 标题 |运动 |好莱坞
我对所有 TAB 使用相同的片段
所以当我点击 Hollywood TAB 然后从服务器获取数据并显示在那个 recyclerView
我曾经遇到过同样的问题
尝试使用
private boolean isViewShown = false;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getView() != null && isVisibleToUser) {
isViewShown = true; // fetchdata() contains logic to show data when page is selected mostly asynctask to fill the data
fetchData();
} else {
isViewShown = false;
} }
调用你的 Api 或者当你到达这里的片段时你想看到什么
View pager 实际上会同时加载上一页、当前页和下一页。这是为了在滑动时获得无缝体验。这可以使用@Jius Lukose
提到的方法来控制
或者请参考答案
How can make my ViewPager load only one page at a time ie setOffscreenPageLimit(0);
我有多个片段,都显示一些新闻
问题是,当我 运行 我的应用程序加载所有片段并从服务器获取所有片段数据时,但我想在移动到该特定片段时获取数据,所以请帮助我
我的代码在下面
MainActivity.Java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setToolbar();
initView();
}
private void initView() {
TabLayout tabLayout=(TabLayout)findViewById(R.id.tablayout);
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
addTabs(tabLayout,viewPager);
BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
}
private void addTabs(TabLayout tabLayout, final ViewPager viewPager) {
final PageAdapter pageAdapter = new PageAdapter(getSupportFragmentManager(), 5);
tabLayout.addTab(tabLayout.newTab().setText(NewsConstant.HeadLines));
tabLayout.addTab(tabLayout.newTab().setText(NewsConstant.Sports));
tabLayout.addTab(tabLayout.newTab().setText(NewsConstant.Health));
tabLayout.addTab(tabLayout.newTab().setText(NewsConstant.India));
tabLayout.addTab(tabLayout.newTab().setText(NewsConstant.World));
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
viewPager.setAdapter(pageAdapter);
viewPager.setOffscreenPageLimit(5);
}
PageAdapter.java
public class PageAdapter extends FragmentStatePagerAdapter {
int mNumOfTabs;
public PageAdapter(FragmentManager fm, int NumOfTabs) {
super(fm);
this.mNumOfTabs = NumOfTabs;
}
@Override
public Fragment getItem(int position) {
return NewsFragment.newInstance(position,position+"");
}
@Override
public int getCount() {
return mNumOfTabs;
}
NewFragment.java
public class NewsFragment extends Fragment {
private RecyclerView recyclerView;
public static NewsFragment newInstance(int index,String title) {
NewsFragment fragment = new NewsFragment();
Bundle args = new Bundle();
args.putInt(NewsConstant.INDEX,index);
args.putString(NewsConstant.TITLE,title);
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_news_list, container, false);
initView(view);
getDataFromServer(); // Here i get data and display
return view;
}
例如。
我在Activity中使用TabLayout、ViewPager来加载Fragments
我有 3 个 TAB 喜欢 标题 |运动 |好莱坞
我对所有 TAB 使用相同的片段 所以当我点击 Hollywood TAB 然后从服务器获取数据并显示在那个 recyclerView
我曾经遇到过同样的问题 尝试使用
private boolean isViewShown = false;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getView() != null && isVisibleToUser) {
isViewShown = true; // fetchdata() contains logic to show data when page is selected mostly asynctask to fill the data
fetchData();
} else {
isViewShown = false;
} }
调用你的 Api 或者当你到达这里的片段时你想看到什么
View pager 实际上会同时加载上一页、当前页和下一页。这是为了在滑动时获得无缝体验。这可以使用@Jius Lukose
提到的方法来控制或者请参考答案 How can make my ViewPager load only one page at a time ie setOffscreenPageLimit(0);