如何在Android上的Fragment中第一次获取数据

时间:2017-08-02 15:51:31

标签: android android-fragments android-viewpager

在我的应用程序中,我有一个activity,在此活动中,我有3个fragments并使用fragments显示此ViewPager
片段#1 中,我向服务器发送请求以获取一些数据并设置为片段#1 视图。

第一次运行时显示此片段,显示加载并获取数据。 在片段之间滚动并收到片段#1 时,再次显示加载和发送请求数据。

我想第一次向服务器发送请求并显示加载,在片段之间滚动时不再向服务器发送此请求!

片段#1中的我的代码:

public class SerialDetailInfoFragment extends Fragment {

@BindView(R.id.infoSerialFrag_castRecyclerView)
RecyclerView infoSerialFrag_castRecyclerView;
@BindView(R.id.epGuideSerialFrag_relatedNewsLay)
RelativeLayout epGuideSerialFrag_relatedNewsLay;
@BindView(R.id.epGuideSerialFrag_relatedNewsRecyclerView)
RecyclerView epGuideSerialFrag_relatedNewsRecyclerView;
@BindView(R.id.epGuideSerialFrag_loadingContent)
AVLoadingIndicatorView epGuideSerialFrag_loadingContent;
@BindView(R.id.infoSerialFrag_addWatchList)
FloatingActionButton infoSerialFrag_addWatchList;

private SerialDetailSendData SendData;
private int serialID;
private String serialImage, chipKey;
private KeyListener variable;
private GoldenGlobeDialogAdapter goldenGlobeDialogAdapter;
private AwardModelAdater awardModelAdapter;
private WhoWatchedAdapter whoWatchedAdapter;
private CastAdapter castAdapter;
private RelatedNewsAdapter relatedNewsAdapter;
private List<Award> awardModel = new ArrayList<>();
private List<String> cloudChipList = new ArrayList<>();
private List<Result> whoWatchedModel = new ArrayList<>();
private List<Star> starModel = new ArrayList<>();
private List<NewsDatum> newsModel = new ArrayList<>();
private String[] mostlyMatchedKeywordsStrings;

public SerialDetailInfoFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    //Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_serial_detail_info, container, false);
    //Initialize
    ButterKnife.bind(this, view);
    context = getActivity();
    seriesActivity = (SeriesDetailActivity) getActivity();
    variable = infoSerialFrag_rememberSwitchText.getKeyListener();
    relatedNewsAdapter = new RelatedNewsAdapter(context, newsModel);
    //Get serial id
    serialID = seriesActivity.getSerialID();
    //Get Collapsing
    isCollapsing = seriesActivity.getCollapsing();
    //Change rate textView
    infoSerialFrag_GenreRateSeekBar.setOnProgressChangeListener(new DiscreteSeekBar.OnProgressChangeListener() {
        @Override
        public void onProgressChanged(DiscreteSeekBar seekBar, int value, boolean fromUser) {
            infoSerialFrag_GenreRateText.setText(value + "");
        }

        @Override
        public void onStartTrackingTouch(DiscreteSeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(DiscreteSeekBar seekBar) {

        }
    });

    hideView(infoSerialFrag_contentLay);

    getData();
    getRelatedNews();

    return view;
}

我的ViewPager代码:

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFrag(new SerialDetailInfoFragment(), context.getResources().getString(R.string.info));
    adapter.addFrag(new SerialDetailEpGuildFragment(), context.getResources().getString(R.string.episodesGuide));
    adapter.addFrag(new SerialDetailReviewFragment(), context.getResources().getString(R.string.reviews));
    viewPager.setAdapter(adapter);
}

private static 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);
    }

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

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

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

我该怎么办?请帮助我的朋友&lt; 3

2 个答案:

答案 0 :(得分:2)

将此行添加到ViewPager设置中。

viewPager.setOffscreenPageLimit(3);

您的setupViewPager方法如下所示:

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFrag(new SerialDetailInfoFragment(), context.getResources().getString(R.string.info));
    adapter.addFrag(new SerialDetailEpGuildFragment(), context.getResources().getString(R.string.episodesGuide));
    adapter.addFrag(new SerialDetailReviewFragment(), context.getResources().getString(R.string.reviews));
    viewPager.setOffscreenPageLimit(3);
    viewPager.setAdapter(adapter);
}

ViewPagers的默认行为是将1 Fragment保留在活动片段左侧和右侧的内存中,这样,为了避免再次执行请求,您可以通过增加此值来维持Fragment的活动。 / p>

这是setOffscreenPageLimit方法

的文档
  

设置应保留在页面两侧的页数   处于空闲状态的视图层次结构中的当前页面。页面超出此范围   在需要时,将从适配器重新创建限制。

     

这是作为优化提供的。如果您事先知道这个号码   您将需要支持或具有延迟加载机制的页面   放在你的页面上,调整这个设置可以带来好处   感知到的分页动画和交互的平滑性。如果你有   少量页面(3-4),您可以一次保持活动状态,   在新创建的视图子树的布局中花费的时间会减少   用户来回翻页。

     

您应该保持此限制,特别是如果您的网页很复杂   布局。此设置默认为1.

如果您将其设置为值3,则Android系统会将所有碎片保持活动状态。

答案 1 :(得分:0)

嗯,你可以设置一个布尔值,默认情况下将其设置为true,并在第一次将其更改为false。为此调用方法。

如果你想拥有布尔值,即使用户退出应用程序并在将来返回,你甚至可以将你定义的变量存储在SharedPrefrences中。

SharedPrefrence值将一直保留,直到用户卸载该应用程序。