2012-08-17 8 views
13

私はPagerAdapterを使用します。私は多くの要素を持っているので、すべての要素を同時にロードしません。私はアダプタをリロードし、古い要素を新しい要素で変更します。たとえば、私は4つの要素を持っています。最後の要素に到達すると要素をリロードし、viewPagerを1の位置に表示できるようにsetCurentItem(1)を呼び出します。私はたくさんのテストをしました。私は置く:ViewPagerのsetCurrentItemが正しい位置ですぐにスクロールしない

viewPager.setCurrentItem(1,false); //But not scroll, put drastically the new page. 
viewPager.setCurrentItem(1); 

私はonPageScrollStateChangedを(int型のarg0)を変更しようとしましたが、私は唯一の3つのビューを持っているし、常に真ん中にubicate。

if (arg0 == ViewPager.SCROLL_STATE_DRAGGING) { 
    if(focusedPage==2) { 
     //Modify adapter 
     viewPager.setCurrentItem(1,false); 

    }else if(focusedPage==0){ 
     //Modify adapter 
     viewPager.setCurrentItem(1,false); 
    } 

そして私は、私はすぐにビューをスクロールする必要がありますが、常にそれが最後のページにあります。この最後の例を使用してonPageSelected(int型のarg0)

focusedPage=arg0; 

を修正するためにしようと試みてきました。 誰も私がスライドする方法を知っています。

答えて

43

は、私はあなたが達成しようとしているかの背景についての詳細を知ることができますありがとう!

とにかく、私が理解できることから、最後のものから最初のものへの "無限の"ものを作ることを試みています(私が間違っていれば私を修正してください)。 ViewPagerは最初のページに移動してスクロールしてもらいたいと思っています。

スムーススクロール(2番目のパラメータ)を無効にすると、スクロールしないページに直接移動します(途中で他のページに変更されません)。滑らかなスクロールを有効にすると、すべてのビューが表示されるので、次のビューではなく最初のビューではないことがわかります。私はこれを念頭において、あなたにお勧めすることができますどのような

/*No swipe animation, and no onPageChanged for the page in the middle*/ 
    mPager.setCurrentItem(1, false); 

    /*The same as if you do not add the second parameter*/ 
    mPager.setCurrentItem(1, true); 

    /*Your ViewPager scrolls through all the needed views until it arrives at that view.*/ 
    mPager.setCurrentItem(1); 

は、あなたが最後の「位置と同じになる位置0に位置0に「ダミー」ビューと「最後」とビューを追加しようとすることができるということです - 1 "であり、最後のビューは位置" 1 "と同じである。したがって、OnPageChangeListenerでは現在のページが「0」または「最後」の位置かどうかをチェックし、そうであればsetCurrentItem( "1"、false)またはsetCurrentItem( "last - 1 "、偽)になります。このようにして、 "ページ変更"効果を維持しながら、必要なものを達成します。

私はこれがあなたの問題に役立つことを願っています。

注: あなたが新しい位置に到達した後、それは、現在次のと最後のビューのためのビューをロードする必要がありますので、それはラグの変化を有することができる(またはあなたが4.0+上にある場合、それがします実際の位置のみをロードする)。

UPDATE:

あなたがViewPagerの内容を決定するリスト/アレイの内容を変更する場合は、あなたが呼び出す必要があります:

ViewPager mPager = new ViewPager(); 
mPager.getAdapter().notifyDataSetChanged(); //This notify that you need to recreate the views 

/*This is if you want to change the data and then go to a specific position 
If you do not do this you will have a very Buggy Behavior*/ 
new Handler().post(new Runnable() { 
@Override 
public void run() { 
    mPager.setCurrentItem(2); //Where "2" is the position you want to go 
    } 
}); 

UPDATE 2:

ViewPagerにすべての要素を追加しないのはなぜですか? ViewPagerには既にこれらのケースを処理するための最適化がありますが、私の場合はその中に多くの要素があり、魅力的に働いています。

あなたのコードでもう1つのことは、ページが「整定」するたびに中間ページに切り替えることです。しかし、あなたは本当に右と左のビューを表示しない、なぜあなたはそれらを持っていますか?

最後に、上記の "notifyDataSetChanged"メソッドを呼び出す必要があるデータセットを変更した後、ハンドラ内で "setCurrentItem"メソッドを呼び出します。そうしなければ、あなたのアプリは期待通りに動かないでしょう。

UPDATE 3:

まあ、私はお勧めできる唯一のことは、あなたがいる限り、あなたがにオブジェクトを挿入しておくと、あなたは、データベースから持って来る新しいオブジェクトを追加し、キープリストを持っていますリストの最後に問題はありません。途中または冒頭にオブジェクトを追加する場合は、notifyDataSetChangedを呼び出す必要がありますが、ビューが再び生成されるため、ゆっくりと処理されます。私たちはこのようにして、それは完全に動作し、サーバーから情報をダウンロードすることさえできます。データはローカルではありません(実際には、リストの最後と先頭に情報を追加します)。

これを達成する方法について他にご質問がありましたら、お気軽にお問い合わせください。

UPDATE 4:

誰もが実際に円形ViewPagerを探しているだけの場合には、私はあなたを再利用することができproof of concept codeを追加しました。それは問題なく動作し、私は複雑なビューでそれを使用していますが、それでもなお遅延はありません。それはpostDelayedないと動作しません

+0

おかげ@Jorgeアギラールを。私はあなたの考えを使用しましたが、私はいくつかのことを変えました。私は "ダミー"ビューを追加しましたが、私は別のビューを入れました。例えば、もし私がa、b、c、d、eを持っていれば、私は初めてを入れました:a、a、a。そして、setCurrentItem(1、false)。ユーザーが次のビューページにスクロールすると、a、b、cおよびsetCurrentItem(1、false)、... onPageScrollStateChangedにこのコードを挿入しました。しかし、今私は少し問題があります。ユーザーがすばやくスクロールしたい場合は、遅延がないため、スクロールできません。あなたは何か考えていますか?ありがとうございました – MARM

+0

あなたの質問を編集したり、新しい問題についての詳細を追加して新しい質問を投稿したりすることで、あなたをよりよく理解し、より良く役立てることができますか?私は既にいくつかの貴重なものを加える答えを更新しました。そして、これを入力した人の回答としてマークすることができれば、それが解決されたことを知ることができます。 –

+0

私は自分の質問を編集しました。 – MARM

1

、このコードを試してみてください。

viewPager.postDelayed(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     viewPager.setCurrentItem(num, true); 
    } 
}, 100); 
関連する問題