23

したがって、ViewPagerを使用する場合、onPageSelectedリスナーは、これと同じ問題の最初のページに対して呼び出されないようです。

現在選択されているページのより高価なUI要素を設定するロジックがいくつかあります。これは、ページが変更されたときに機能しますが、it doesn't work for the first page.

リスナーの後に現在のアイテムを設定すると、最初のページに対してコールバックが発生しますが、ビューはまだ初期化されていないため、操作できません。

// 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はnullになります。PagerAdapter.instantiateItemですから、私の質問は、アクティビティライフサイクルのどの時点で、ViewPagerがビューを初期化したことを確認できるかということだと思います。内部Activity.onAttachedToWindowでこれを試してみActivity.onResumeましたが、どちらも以前に解雇されたようPagerAdapter.instantiateItemです。

4

3 に答える 3

5

ホスティングアクティビティではなく、フラグメント自体に言及しているロジックがないのはなぜだろうか。ViewPagerは、現在のフラグメントの両側にいくつかのフラグメントをバッファリングするため、バックグラウンドでセットアップされ、ユーザーがそれらにスワイプしたときにすぐに使用できるようになります。ロジックを組み込むというonPageSelectedことは、この機能をバイパスし、ユーザーがページにスワイプするまで手間のかかる作業を行わないことを意味します。

何らかの理由で上記を実行できないと仮定して、コールバック関数でインターフェイスを使用してみませんか。フラグメントのonCreateView関数でコールバックをトリガーして、アクティビティが完全にインスタンス化されたことを通知します。

于 2012-09-14T12:48:10.403 に答える
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.!
        }
    }
于 2012-09-20T09:23:31.660 に答える
1

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

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);
于 2015-09-25T08:19:59.037 に答える