59

私のページャーアダプター( PagerAdepter を拡張)にはテキストビューがあります。そして、このテキストビューを MainActivity の onPageSelected で更新します。位置 > 0 のテキストビューを更新しますが、開始ページ (位置 0) は起動時に更新されません。前にスワイプしてから後ろにスワイプすると、位置0の値を設定しますが、STARTで値を設定できませんでした。スターページの値を設定するにはどうすればよいですか?

public void onPageSelected(int position) {

             switch (position) {
                case 0: 

                     PagerAdapter.tv.setText("value"); // => doesnt work on start

                    break;

                            default:
                                   PagerAdapter.tv.setText("value");
                                         break;
}
}

完全なコード:

public class QuizStart extends SlidingFragmentActivity {
 @Override
        protected void onCreate(final Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

           this.setContentView(R.layout.activity_main);

              mPager = (ViewPager)findViewById(R.id.pager);         
            QuestionPagerAdapter mAdapter = new QuestionPagerAdapter();

            mPager.setAdapter(mAdapter);
            QuizStart.onPageSelected(0);

         mPager.setOnPageChangeListener(new OnPageChangeListener() {


            @Override
            public void onPageScrollStateChanged(int arg0) { }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) { }

            @Override
            public void onPageSelected(int position) {

             switch (position) {
                case 0: 

                     PagerAdapter.tv.setText("value"); // => doesnt work on start

                    break;

                            default:
                                   PagerAdapter.tv.setText("value");
                                         break;
                }
            }

        });
}
}
4

10 に答える 10

54

私にとっては、次のコードで作業します

    viewPager.addOnPageChangeListener(myOnPageChangeListener);

.

    ViewPager.OnPageChangeListener myOnPageChangeListener = new ViewPager.OnPageChangeListener() {

    //declare key
    Boolean first = true;

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        if (first && positionOffset == 0 && positionOffsetPixels == 0){
            onPageSelected(0);
            first = false;
        }
    }

    @Override
    public void onPageSelected(int position) {
        //do what need
    }

    @Override
    public void onPageScrollStateChanged(int state) {
    }
};
于 2016-01-08T11:13:23.610 に答える
1

アクティビティの onCreate() メソッドの最初のページで実行するコードを追加して、アプリの問題を修正しました。

それは最も美しいハックではなく、冗長なコードが含まれますが、ページが変更されたときにテキストデータをロードしたいだけなので、私の場合はそれを行う最も簡単な方法です.

onPageSelected() を手動で呼び出すと NullPointerExceptions が発生しましたが、上記の他のコメントで説明されています。

于 2015-09-11T12:31:57.870 に答える
0

あなたが本当にやりたいことはgetPageTitle()、 をオーバーライドしてから、別の場所で、そのページのタイトルを取得して TextView のテキストとして設定することだと私には思えます。

そうすれば、アクティビティを初期化するときに PagerAdapter を初期化して を呼び出しますgetTitle(0)。これにより、ページ 0 のタイトルが取得されます。これをアクティビティのテキストビューに設定します。後で、ページを変更するたびに、getTitle(newPosition)その TextView を呼び出して更新するだけです。

于 2013-04-18T04:03:05.303 に答える
0

データセットをロードするためにいくつかの AsyncTasks を使用する可能性があり、どのタスクが最後に終了するかを判断するのは困難です。そして、その最後のタスクの後、データセット全体が完了したときにのみ、OnPageSelected を呼び出すことができます。これは、データセット全体にわたって UI でフラッシュを実行しているためです。

ページが初めてロードされるときに OnPageSelected 関数を手動で呼び出す代わりに、「通常の」方法で段階的に UI を構築します。後でユーザーがページを変更すると、データセットが完成し、OnPageSelected 関数で更新が行われるように保存されます。

于 2015-04-20T15:03:47.807 に答える
0

実際、この回答に基づいて良い方法を見つけました。

問題はViewPager、リスナーのセットアップ時に が完全にロードされず、最初のページが呼び出されても 内のフラグメントがViewPagerまだ完全に初期化されていないことです。

それを修正するために、最初のページが呼び出されたかどうかを知るために変数を保持するだけです:

private boolean mFirstPageCalled = false;

次に、リスナーで:

@Override
public void onPageSelected(int position) {

    if(mFirstPageCalled) {
        // Do your thing
    } else {
        mFirstPageCalled = true;
    }
}

最後に行うことは、見逃された最初のページを処理することです。これは、ViewPagerが完全に作成された後に行うことができます:

    mViewPager.post(new Runnable(){
        @Override
        public void run() {
            // Do your thing
        }
    });

私の場合、現在のフラグメントが示していたここにコールバックして、それに取り組みます。

Fragment currentFragment = mPagerAdapter.instantiateItem(mViewPager, mViewPager.getCurrentItem());
currentFragment.customAction();

このpostメソッドは一度しか呼び出されないため、最初のページ ケースを処理するのに最適です。

于 2016-05-13T10:18:55.557 に答える
0

私の解決策は ViewPager の拡張です

class MyViewPager extends ViewPager {

    private List<OnPageChangeListener> _Listeners = new ArrayList<>();

    public MyViewPager(Context context) {
        super(context);
    }

    public MyViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void addOnPageChangeListener(OnPageChangeListener listener) {
        super.addOnPageChangeListener(listener);
        _Listeners.add(listener);
    }

    @Override
    public void removeOnPageChangeListener(OnPageChangeListener listener) {
        super.removeOnPageChangeListener(listener);
        _Listeners.remove(listener);
    }

    @Override
    public void setCurrentItem(final int item) {
        if (item != getCurrentItem()) {
            super.setCurrentItem(item);
        } else {
            post(new Runnable() {
                @Override
                public void run() {
                    dispatchOnPageSelected(item);
                }
            });
        }
    }

    private void dispatchOnPageSelected(int position) {
        for (int i = 0, size = _Listeners.size(); i < size; i++) {
            OnPageChangeListener listener = _Listeners.get(i);
            if (listener != null) {
                listener.onPageSelected(position);
            }
        }
    }
}
于 2016-10-22T17:37:10.673 に答える