2013-07-09 3 views
5

私はポストの前にSOを検索しようとしましたが、フラグメント内でホストされているViewPagerのコンテンツをリフレッシュする方法を理解できません。 私を助けてもらえますか?Androidは、フラグメント内のViewPagerをリフレッシュします

ありがとうございました

ここに私のコード。 私は内部にViewPagerをホストするフラグメントアクティビティを持っています。それは別のウィジェットを表示し、ViewPagerは別のイメージを表示する、私はコードのdb "carosello"から返されたイメージのリストを呼び出します。私は検索を実行するときに、このフラグメントをホストする主なアクティビティからのコールバックとしてrefresh()メソッドを呼び出して、すべてのビューを再度設定します。フラグメント内のすべての情報は正常に動作しますが、ViewPagerでは機能しません。最も古い(最初に作成された)イメージが常に表示されます。

public class Page2FamigliaFragment extends Fragment { 

//... variable declaration 

@Override 
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) { 

    // fragment not when container null 
    if (container == null) { 
     return null; 
    } 
    // inflate view from layout 
    View view = (LinearLayout)inflater.inflate(R.layout.famiglia_page2,container,false); 

    //retrieve my object from the main view that host this fragment 
    info = ((MainFamiglia)this.getActivity()).getMyObject(); 

    //run the setup of the view.  
    setUpMyPage2View(view); 

    return view; 
} 

public void setUpMyPage2View(View view) 
{ 
//... inizialization of some other objects and view - i do not show only because is out of topic for this matter 
//retrive the image used in the page viewer 
    carosello = info.getCarosello(); 
    parts = carosello.split(","); 

    //how many page ?? 
    int i = parts.length/3; 
    int resto = parts.length % 3; 
    int pages = 0; 
    if (resto!=0) { 
     pages = i + 1; 
    } else { 
     pages = i; 
    } 

List<Fragment> fragments = new ArrayList<Fragment>(); 

    String[] tempArray; 
    int startIndex = 0; 
    int endIndex = 3; 


    if (parts.length <= 3) { 

    fragments.add(myCarosello.newInstance(parts)); 

    } else { 


    tempArray = Arrays.copyOfRange(parts, startIndex, endIndex); 

    for (int p=0; p < pages; p++) { 

     fragments.add(myCarosello.newInstance(tempArray)); 
     startIndex = endIndex; 
     endIndex = ((endIndex+3) > parts.length) ? parts.length : (endIndex+3); 
     tempArray = Arrays.copyOfRange(parts, startIndex, endIndex); 

    } 

    } 

    pageAdapter = new MyPageAdapter(getChildFragmentManager(), fragments); 

    pager = (ViewPager) view.findViewById(R.id.viewpager); 
    pager.setAdapter(pageAdapter); 
    pager.setOnTouchListener(new OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if(
        event.getAction() == MotionEvent.ACTION_DOWN && 
        v instanceof ViewGroup 
     ) { 
        ((ViewGroup) v).requestDisallowInterceptTouchEvent(true); 
      } 
      return false; 
     } 
    }); 

} 

//i call this method from a callback from the main view for refresh this fragment 
public void refresh(){ 
    //recupero oggetto dalla activity principale 
    info = ((MainFamiglia)this.getActivity()).getMyObject(); 
    pager.getAdapter().notifyDataSetChanged(); 
    pager.removeAllViews(); 
    setUpMyPage2View(this.getView()); 
} 
} 

この

はpageAdapter

public class MyPageAdapter extends FragmentPagerAdapter { 

// fragments to instantiate in the viewpager 
    private List<Fragment> fragments; 

    // constructor 
    public MyPageAdapter(FragmentManager fm,List<Fragment> fragments) { 
     super(fm); 
     this.fragments = fragments; 
    } 

    // return access to fragment from position, required override 
    @Override 
    public Fragment getItem(int position) { 
     return this.fragments.get(position); 
    } 

    // number of fragments in list, required override 
    @Override 
    public int getCount() { 
     return this.fragments.size(); 
    } 

    public int getItemPosition(Object object) { 
     return POSITION_NONE; 
} 

}

ためのクラスであり、これは私がのおかげで解決しました

public class myCarosello extends Fragment { 

public static final String EXTRA_MESSAGE = "EXTRA_MESSAGE"; 
private int numeroImmagini = 0; 

public static final myCarosello newInstance(String[] pictures) 
{ 
    myCarosello f = new myCarosello(); 
    Bundle bdl = new Bundle(1); 
    bdl.putStringArray(EXTRA_MESSAGE, pictures); 
    f.setArguments(bdl); 

    return f; 
} 

@Override 
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) { 

    String[] pictures = getArguments().getStringArray(EXTRA_MESSAGE); 
    numeroImmagini = pictures.length; 

    View view = (LinearLayout)inflater.inflate(R.layout.carosello,container,false); 

    ImageView imageView1 = (ImageView) view.findViewById(R.id.carosello1); 
    ImageView imageView2 = (ImageView) view.findViewById(R.id.carosello2); 
    ImageView imageView3 = (ImageView) view.findViewById(R.id.carosello3); 

    switch (numeroImmagini) { 
    case 1: 
     imageView1.setImageResource(returnImageResource(pictures[0])); 
     imageView2.setVisibility(View.GONE); 
     imageView3.setVisibility(View.GONE); 
    break; 
    case 2: 
     imageView1.setImageResource(returnImageResource(pictures[0])); 
     imageView2.setImageResource(returnImageResource(pictures[1])); 
     imageView3.setVisibility(View.GONE); 
    break; 
    case 3: 
     imageView1.setImageResource(returnImageResource(pictures[0])); 
     imageView2.setImageResource(returnImageResource(pictures[1])); 
     imageView3.setImageResource(returnImageResource(pictures[2])); 
    break; 

    } 

    return view; 

} 

//return the correct resource name 
private int returnImageResource(String image) 
{ 
    image = image.replace(" ", "_"); 
    String filenameArray[] = image.split("\\."); 
    image = "img_" + filenameArray[0].toLowerCase(); 
    int drawableImageId = getActivity().getResources().getIdentifier(image, "drawable", getActivity().getPackageName()); 
    return drawableImageId; 
} 
} 
+0

https://github.com/pchauhan/RefreshFragementViewPager素晴らしい –

答えて

32

pageviewer内部ImageViewのためのクラスです。 this投稿 変更MyPageAdapter extends FragmentPagerAdapterMyPageAdapter extends FragmentStatePagerAdapter

+0

!それはちょうど働いた! –

+0

ありがとうございましたフラグメントを交換するときに同じ問題があった – Joseph27

+0

私を助けてくださいhttp://stackoverflow.com/questions/33012056/view-pager-first-and-second-fragment-data-is-not-updating-when-data-変更された –

0

フラグメントメソッドの最初のオーバーライド

@Override

public void setUserVisibleHint(boolean isVisibleToUser) { 

    super.setUserVisibleHint(isVisibleToUser); 
    if(isVisibleToUser){ 

     actionView(); 
    } 
    else{ 
     //no 
    } 

} 
関連する問題