2013-07-09 9 views
5

Ich habe versucht, innerhalb von SO vor dem Beitrag zu suchen, aber ich bin nicht in der Lage zu verstehen, wie Sie den Inhalt von ViewPager in einem Fragment gehostet aktualisieren. Können Sie mir bitte helfen?Android erfrischen einen ViewPager in einem Fragment

Vielen Dank für Ihre Zeit

Hier mein Code. Ich habe die Fragment-Aktivität, die den ViewPager darin hostet. Es zeigt ein anderes Widget und der ViewPager zeigt ein anderes Bild, ich rufe die zurückgegebene Bildliste von der db "carosello" im Code auf. Wenn ich eine Suche durchführe, rufe ich die refresh() -Methode als Callback von der Hauptaktivität auf, die dieses Fragment hostet, und ich setze wieder alle Ansichten ein. Funktioniert gut für alle Informationen im Fragment, funktioniert aber nicht für den ViewPager: Das älteste (erstmalig erstellte) Bild wird immer angezeigt.

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()); 
} 
} 

Dies ist die Klasse für die 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; 
} 

}

und das ist die Klasse für den Imageview in der Viewer

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 –

Antwort

32

ich dank gelöst habe zu this Beitrag Änderung MyPageAdapter extends FragmentPagerAdapter zu MyPageAdapter extends FragmentStatePagerAdapter.

+0

Excellent! Es hat einfach funktioniert! –

+0

Danke hatte das gleiche Problem beim Ersetzen des Fragments – Joseph27

+0

bitte helfen Sie mir http://stackoverflow.com/questions/33012056/view-pager-first-and-second-fragment-data-is-not-updating-when-data- change-in-a –

0

erste Überschreibung in dem Fragment Methode

@Override

public void setUserVisibleHint(boolean isVisibleToUser) { 

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

     actionView(); 
    } 
    else{ 
     //no 
    } 

} 
Verwandte Themen