【问题标题】:How to prevent Fragment from loading data every time from server when swiping Tabs in TabLayout in android?在android的TabLayout中滑动Tab时如何防止Fragment每次从服务器加载数据?
【发布时间】:2016-04-08 19:49:32
【问题描述】:

我是Fragments 的新手。我的TabLayout 中有 5 个不同的Fragments。在每个片段中,我都从服务器加载数据。

我的问题如下: 当第一个片段加载时,它调用函数并从服务器加载数据并显示在RecyclerView 上。

然后,当我滑动到第二个选项卡时,服务器数据会加载,依此类推。但是当我再次滑动说片段一时,数据再次从服务器加载,RecyclerView 需要再次设置。

有没有什么地方我可以只加载一次服务器数据(而不将其保存到本地数据库)并只设置一次recyclerview,这样无论我刷多少次标签,数据都不会再次加载?我已经提到了here,但我真的不明白如何解决我的问题。我正在发布我的代码的 sn-p。

标签活动

public class TabActivity extends AppCompatActivity {
ViewPager viewpager;
Toolbar toolbar;
TabLayout tablayout;
ViewPagerAdapter viewPagerAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tab_activity);
    initialize();




}

private void initialize() {
    viewpager = (ViewPager) findViewById(R.id.viewpager);
    toolbar = (Toolbar) findViewById(R.id.toolbar);
    tablayout = (TabLayout) findViewById(R.id.tablayout);
    setSupportActionBar(toolbar);
    viewPagerAdapter=new ViewPagerAdapter(getSupportFragmentManager());
    viewpager.setAdapter(viewPagerAdapter);
    tablayout.setTabsFromPagerAdapter(viewPagerAdapter);
    tablayout.setupWithViewPager(viewpager);

}


}

 class ViewPagerAdapter extends FragmentStatePagerAdapter implements ViewPager.OnPageChangeListener {

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

@Override
public Fragment getItem(int position) {
    switch (position) {
        case 0:return LocatedEvents.newInstance();

        case 1:return QrCodeScanner.newInstance();
        case 2:return NewsFeed.newInstance();

        case 3:return CreatePoll.newInstance();
        case 4:return MyProfile.newInstance();
    }
    return NewsFeed.newInstance();
}

@Override
public int getCount() {
    return 5;
}
@Override
public CharSequence getPageTitle(int position) {
    return "Tab " + (position + 1);
}

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

}

@Override
public void onPageSelected(int position) {

}

@Override
public void onPageScrollStateChanged(int state) {

}
}

NewsFeed 片段

public class NewsFeed extends Fragment {
@Nullable

public static NewsFeed newInstance() {
    return new NewsFeed();
}

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

    View view = inflater.inflate(R.layout.newsfeed_fragment, container, false);
    load_data();
    return view;
}
}

【问题讨论】:

    标签: android android-fragments android-tablayout


    【解决方案1】:

    避免每次都创建新的片段

    @Override
    public Fragment getItem(int position) {
     switch (position) {
      case 0:
       return LocatedEvents.newInstance();
    
      case 1:
       return QrCodeScanner.newInstance();
      case 2:
       return NewsFeed.newInstance();
    
      case 3:
       return CreatePoll.newInstance();
      case 4:
       return MyProfile.newInstance();
     }
     return NewsFeed.newInstance();
    }
    

    制作一个片段数组并将其传递给您的适配器。类似这样的东西

    @Override
    public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_dashboard);
    
     initFragments();
    
    }
    
    private void initFragments() {
    
      ArrayList < Fragment > fragmentArrayList = new ArrayList < > ();
    
      fragmentArrayList.add(LocatedEvents.newInstance());
      fragmentArrayList.add(QrCodeScanner.newInstance());
      fragmentArrayList.add(NewsFeed.newInstance());
      fragmentArrayList.add(MyProfile.newInstance();
    
       viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(), fragmentArrayList); viewpager.setAdapter(viewPagerAdapter); tablayout.setTabsFromPagerAdapter(viewPagerAdapter); tablayout.setupWithViewPager(viewpager);
      }
    

    并在您的适配器中将其更改为

    private ArrayList < Fragment > fragments;
    
      public ViewPagerAdapter(FragmentManager fm, ArrayList < Fragment > fragments) {
       super(fm);
       this.fragments = fragments;
      }
    
      @Override
      public Fragment getItem(int position) {
       return fragments.get(position);
      }
    
      @Override
      public int getCount() {
       return fragments.size();
      }
    

    【讨论】:

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