2011-12-26 8 views
4

ビューV1、V2、V3でViewPagerを使用しています。ボタンをクリックして、各ビューで使用するLinearLayoutの可視性を設定しようとしています。このコードでは、現在のビューではなく次のビューで変更が適用されます。例えば私はV5にいる。クリックすると、V6のオブジェクトを非表示/表示します。私がV6からV5に戻ると、V4の変更が適用されます。ここでViewPagerで現在のビューをリフレッシュする方法

はコードです:

public class FragmentStatePagerSupport extends FragmentActivity { 
    static final int NUM_ITEMS = 10; 
    MyAdapter mAdapter; 
    ViewPager mPager; 
    static int mNum; 

    private Button btn_zoom; 
    static LinearLayout LL_Head; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.fragment_pager); 

     mAdapter = new MyAdapter(getSupportFragmentManager()); 

     mPager = (ViewPager)findViewById(R.id.pager); 
     mPager.setAdapter(mAdapter); 
     mPager.setCurrentItem(5); 

     btn_zoom = (Button)findViewById(R.id.btn_zoom); 
    btn_zoom.setOnClickListener(new OnClickListener(){ 
     @Override 
     public void onClick(View v) { 
       if (LL_Head.getVisibility() == View.VISIBLE) { 
        LL_Head.setVisibility(View.GONE); 
       }else{ 
        LL_Head.setVisibility(View.VISIBLE); 
       } 
      } 
     }); 

. 
. 
. 


    } 

    public static class MyAdapter extends FragmentStatePagerAdapter { 
     public MyAdapter(FragmentManager fm) { 
      super(fm); 
     } 

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

     @Override 
     public Fragment getItem(int position) { 
      return ArrayListFragment.newInstance(position); 
     } 
    } 

    public static class ArrayListFragment extends ListFragment { 
     static ArrayListFragment newInstance(int num) { 
      ArrayListFragment f = new ArrayListFragment(); 
      Bundle args = new Bundle(); 
      args.putInt("num", num); 
      f.setArguments(args); 
      return f; 
     } 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      mNum = getArguments() != null ? getArguments().getInt("num") : 1; 
     } 


     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      View v = inflater.inflate(R.layout.sura_vpager, container, false); 

      TextView tv1=(TextView) v.findViewById(R.id.txtHead); 
      tv1.setText("Fragment #" + mNum); 

      LL_Head = (LinearLayout)v.findViewById(R.id.LL_Head); 

      return v; 
     } 

のJavaの番号は0から始まりますが、5番目の項目を設定したい場合にこのように、あなたがmPager.setCurrentItemを(呼び出す必要があり おかげ

答えて

0

を教えてください4)。

希望すると便利です。

+0

上記の説明の最後の部分は読んでいませんでした: "....私がV6からV5に戻ると、V4の変更が適用されます" – Azam

3

流暢な経験をするために、ViewPagerは、現在見ているビューだけでなく、隣接するビューも読み込みます。つまり、ポジション0からポジション1までスクロールしている場合、実際にはポジション2がロードされているため、スクロールすると準備が整います。このため、変更は現在のビューではなく、「次のビュー」に適用されます(ビュー2から1にスクロールしてから、ビュー0が作成された場合)。

静的なLinearLayoutをOnCreateに設定しているので、変更されたのは最後に作成されたビューだけです。これは、ページャーの最後までスクロールしていれば、あなたが見ているビューになります。代わりに、ユーザーが見ているフラグメント(ViewPager.setOnPageChangeListener())を追跡して、アダプタ内のフラグメントをキャッシュする必要があります。あなたはあなたが望む断片の位置を知っています。そして、あなたがそれを求めたら、以前に作成したものを返します(新しいものを作成しないでください:))。

または、tl; drバージョン: LL_Headは、ほとんどの場合、現在のフラグメントではなく、次のフラグメントに設定されます。静的に設定しないでください。あなたのPagerAdapterにそれをキャッシュし、必要な時にそれを呼び出す。

編集: また、フラグメントが問題のレイアウトを表示するかどうかを示す並べ替えのイベントを聴取したい場合があります。それ以外の場合は、すべてのフラグメントではなく、これによって影響を受ける現在のフラグメントのみになります。

関連する問題