2012-08-28 1 views
22

ViewPagerを使用すると、onPageSelectedリスナーは、同じ問題の最初のページではthisと呼ばれることはありません。ViewPager onPage最初のページに選択しました

私は現在選択されているページのためのいくつかのより高価なUI要素を移入し、ページが変更されたとき、この作品いくつかのロジックを持っていますが、it doesn't work for the first page.

私は、リスナーの後に現在の項目を設定した場合、コールバックがためにトリガーされます最初のページが、ビューはまだ初期化されていないので、私はそれを操作することはできません:PagerAdapter.instantiateItemがまだ実行されていないので、ここで

// Inside PagerAdapter.instantiateItem 

ViewHolder vh = new ViewHolder(); 
cursor.moveToPosition(position); 
vh.view = adapter.newView(context, cursor, null); 
// Set position as tag so we can retrieve it with findViewByTag 
vh.view.setTag(position); 

((ViewPager) collection).addView(vh.view,0);  

return vh; 

// Inside MyActivity.onCreate 

pagerAdapter = new SingleMessagePagerAdapter(this, cursor); 
pager = (ViewPager)findViewById(R.id.message_pager); 
pager.setAdapter(pagerAdapter); 
pager.setOnPageSelectedListener(this); 
pager.setCurrentItem(selectedItem); 

// Inside MyActivity.onPageSelected 

// Retrieve tagged view 
View view = pager.findViewWithTag(position); 

viewはヌルなってしまいます。だから私は自分の質問は、ビューライフサイクルのどの時点で、私はViewPagerがビューを初期化したことを確信できますか?私はActivity.onAttachedToWindowActivity.onResumeの中でこれをやろうとしましたが、どちらもPagerAdapter.instantiateItemの前に解雇されているようです。

答えて

2

フラグメントを使用しよう!

public class SectionsPagerAdapter extends FragmentPagerAdapter { 

    public SectionsPagerAdapter() { 
     super(getSupportFragmentManager()); 
    } 

    @Override 
    public Fragment getItem(int i) { 
     Fragment fr = null; 
     if (i==0) 
      fr = new sec0frag(); 
     else if (i==1) 
      fr = new sec1frag(); 
     else if (i==2) 
      fr = new sec2frag(); 
     return fr; 
    } 

    @Override 
    public int getCount() { 
     return 3; 
    } 
} 

及び例えば3つのフラグメントクラス

を作成:

public static class sec0frag extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
        // here is initialize for first time to view pages.! 
     } 
    } 
+0

これは動作するはずですが、どのような場合は、数事前に定義されていないページのリストをスクロールする必要がありますか?ウェブから取り出されたアイテムのリストのように、それぞれのアイテムがこれらのページャにそれぞれ表示される必要がありますか? –

+0

FragmentPagerAdapterのgetCount()を動的に定義するか、ViewPagerでenableループを試してみてください!! – SSKahani

5

私は、あなたがホスティングアクティビティではなくフラグメント自体に言及するロジックを持っていないのはなぜだろうかと思います。 ViewPagerは、現在のものの片側に2つのフラグメントをバッファリングするので、それらはバックグラウンドで設定され、ユーザがそれらにスワイプしたときに移動する準備ができます。ロジックをonPageSelectedに入れると、この機能をバイパスし、ユーザーがページにスワイプするまでは重い荷物を持たないことを意味します。

何らかの理由で上記を行うことができない場合は、Interface with a callback functionを使用しないでください。フラグメントのonCreateView関数でコールバックをトリガして、アクティビティが完全にインスタンス化されたことを知らせます。

1

私の解決策は、ページャアダプタを拡張し、内部にインターフェイスを作成することでした。次に、アダプターを作成した後に、アダプターがインターフェースを1回だけ呼び出すようにします。インターフェイスのコールバックの内部では、nullpointerexceptionを持たずにonPageChangedメソッドを呼び出すことができます。このクラスをプロジェクトに追加し、そこからアダプタを拡張します。アダプターをviewpagerに設定する前に、リスナーをアダプターに設定するのを忘れないでください。以下のアダプタクラス:

public abstract class ExtendedPagerAdapter extends FragmentPagerAdapter { 

private boolean instantiated; 
private AdapterListener adapterListener; 

public interface AdapterListener { 
    void onAdapterInstantiated(); 
} 

public ExtendedPagerAdapter(FragmentManager fragmentManager) { 
    this(fragmentManager, null); 
} 

public ExtendedPagerAdapter(FragmentManager fragmentManager, AdapterListener adapterListener) { 
    super(fragmentManager); 
    this.adapterListener = adapterListener; 
    instantiated = false; 
} 

@Override 
public void finishUpdate(ViewGroup container) { 
    super.finishUpdate(container); 
    if (!instantiated) { 
     instantiated = true; 
     if (adapterListener != null) { 
      adapterListener.onAdapterInstantiated(); 
     } 
    } 
} 

public void setAdapterInstantiatedListener(AdapterListener adapterListener) { 
    this.adapterListener = adapterListener; 
} 
} 

アクティビティコード:

adapter = new ViewPagerAdapter(getChildFragmentManager()); 
    adapter.setAdapterInstantiatedListener(new ExtendedPagerAdapter.AdapterListener() { 
     @Override 
     public void onAdapterInstantiated() { 
      onPageSelected(viewPager.getCurrentItem()); 
     } 
    }); 

    viewPager.addOnPageChangeListener(this); 
    viewPager.setAdapter(adapter); 
関連する問題