【问题标题】:swipe views with tabs loading all the framents at the same time使用选项卡滑动视图同时加载所有片段
【发布时间】:2016-04-28 02:08:50
【问题描述】:

我创建了一个带有标签的滑动视图。

问题在于,当创建活动时,三个片段同时加载。我将默认片段设置为在活动打开时启动,因此其他片段没有从服务器下载数据,除非有人滑动到该片段。

这是我的活动,我不会放三个片段中的代码,因为我认为与解决方案无关,但如果有必要,请告诉我。

import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import java.util.ArrayList;
import java.util.List;


public class Information extends AppCompatActivity {

private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;

String id;
String idUser;
Complejo complejo;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_icon_text_tabs);
    recogerParametro();
    setTitle(complejo.getName());


    viewPager = (ViewPager) findViewById(R.id.viewpager);
    viewPager.setOffscreenPageLimit(2);
    setupViewPager(viewPager);

    tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);
}

public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_informacion_complejo, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.btn_llamarBarra:
            try {
                Intent callIntent = new Intent(Intent.ACTION_CALL);
                callIntent.setData(Uri.parse("tel:" + complejo.getTelefono().toString()));
                startActivity(callIntent);
            } catch (ActivityNotFoundException activityException) {
                Log.e("Llamando..", "Falló la llamada", activityException);
            }
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFrag(new GaleriaComplejoFragment(), "GALERÍA");
    adapter.addFrag(new InformacionComplejoFragment(), "INFORMACIÓN");
    adapter.addFrag(new ComentariosComplejoFragment(), "COMENTARIOS");
    viewPager.setAdapter(adapter);
    viewPager.setCurrentItem(1, false);
}

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

private void recogerParametro() {
    id= getIntent().getStringExtra("id");
    idUser = getIntent().getStringExtra("idUser");
    complejo = (Complejo) getIntent().getSerializableExtra("complejo");
}
}

谢谢你帮助我!

【问题讨论】:

  • ViewPager 功能:一次加载 3 个片段,第一个是默认片段,第二个:左侧片段到默认片段,第三个:右侧片段到默认片段
  • 我知道,但是如何更改代码?
  • 将代码放在片段中的 onresume 中,条件是如果未加载数据,则仅加载新数据,否则显示已加载的数据。因为 onresume 被多次调用。

标签: java android android-fragments android-studio swipe


【解决方案1】:

如前所述,您无法随时在 ViewPager 中加载单个视图/片段,因为最小 offScreenPageLimit 为 1,即一次至少加载三个片段。

如果您只想在片段可见时(即滑动时)加载数据结构并填充视图,请使用片段的 setUserVisibleHint() 方法 -

@Override
  public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    if (isVisibleToUser) {
      loadMyStuff();
    }
  }

您还可以在从服务器调用收到数据后缓存数据,并仅在 setUserVisibleHint() 内为 null 时检查请求

请注意,每次滑动 Fragment 时都会调用此方法。

【讨论】:

  • 这不是问题所在。你说的可以。但问题是当活动初始化时,第一个片段开始加载。
  • 那么你到底想在什么时候加载片段数据?
【解决方案2】:
private boolean isLoaded =false,isVisibleToUser;

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
this.isVisibleToUser=isVisibleToUser;
if(isVisibleToUser && isAdded() ){
    loadData();
    isLoaded =true;
 }
}

 @Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
if(isVisibleToUser && (!isLoaded)){
    loadData();
    isLoaded=true;
    }
}

【讨论】:

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