2016-04-28 71 views
0

我使用標籤創建了一個刷卡視圖。同時加載所有分支的標籤刷卡視圖

問題是,當活動創建時,三個片段同時加載。當活動打開時,我設置默認片段開始,所以其他片段沒有從服務器下載數據,但不會有人刷到這個片段。

這是我的活動,我不會從三個片段中放置代碼,因爲我認爲與解決方案無關,但是如果有必要讓我知道。

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

感謝您的幫助!

+0

ViewPager功能:它加載在同一時間3片段,第一次默認的,第二:左片段默認的,第三:正確的片段到默認的一個 –

+0

我知道,但我怎樣才能改變代碼? –

+0

將代碼放入onresume中,條件是如果數據未加載,則只加載新數據,否則顯示已加載的數據。因爲onresume被多次調用。 – androidnoobdev

回答

0

如前所述,您無法隨時在ViewPager中加載單個視圖/片段,因爲offScreenPageLimit的最小值爲1,即一次最少加載三個片段。

如果要加載的數據結構和填充的觀點,只有當片段變得刷卡時可見即使用您的片段setUserVisibleHint()方法 -

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

    if (isVisibleToUser) { 
     loadMyStuff(); 
    } 
    } 

您也可以緩存,一旦你的數據已從服務器調用收到它,並且僅在其內部爲空時檢查請求setUserVisibleHint()

請注意,每次擦除Fragment時都會調用此方法。

+0

那不是問題。你說的沒關係。但問題是當活動inicializate,第一個片段開始加載。 –

+0

那麼,當你想要加載片段數據? – Siddharth2092

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