2016-04-28 2 views
0

タブでスワイプビューを作成しました。タブを使ってビューをスワイプしてすべてのフレーズを同時にロードする

問題は、アクティビティが作成されたときに3つのフラグメントが同時にロードされることです。アクティビティが開かれたときにデフォルトのフラグメントを開始するように設定しました。他のフラグメントは、サーバからのデータをダウンロードしていません。誰かがこのフラグメントにスワイプします。

これは私の活動ですが、解決策には関係ないと思うので、私は3つの断片のコードを入れませんが、必要ならば教えてください。

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機能:デフォルトの1に左の断片、第三:それは第一第二デフォルト1、、一度に3フラグメントをロードし、デフォルトに右フラグメント1 –

+0

私はそれを知っているが、どのように私は変更することができますコード? –

+0

データがロードされていない場合は、新しいデータのみがロードされ、それ以外の場合はすでにロードされているデータが表示されるという条件付きで、フラグメントをonresumeにコードを入れます。 onresumeは何度も呼び出されるからです。 – androidnoobdev

答えて

0

すでに述べたように、最小のoffScreenPageLimitが1であるため、ViewPagerで1つのビュー/フラグメントを読み込むことはできません。つまり、一度に3つ以上のフラグメントが読み込まれます。

あなたのデータ構造をロードし、フラグメントはスワイプ見えるすなわちになったときにのみビューを移入、あなたのフラグメントの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; 
    } 
} 
関連する問題