1

Dies ist das Fragment, in dem ich Bild mit camera2basic (Google Sample) erfassen.Fragment in ViewPager nicht aktualisiert

enter image description here

Und diese Methode i die Galerie mit den neuesten aufgenommenen Bild zu aktualisieren, bin mit:

private void refreshGallery(File file) 
    { 
     Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
     intent.setData(Uri.fromFile(file)); 
     getActivity().sendBroadcast(intent); 
    } 

Und das ist die Galerie Fragment, wo ich alle Bilder zeige, gespeichert in SD-Karte:

enter image description here

ist hier mit einer MainActivity ViewPager, die 5 Fragmente ist mit:

  • FragmentHome
  • FragmentGallery
  • FragmentCamera
  • FragmentStar
  • FragmentProfile

und innerhalb FragmentGallery, gibt es eine andere ViewPager (GalleryViewPager), die 2 Fragmente aufweist, ist:

  • FragmentPhotos
  • FragmentVideos

Nun, wie Sie die CameraFragment ist in einem ViewPager sehen können, von MainActivity und die FragmentPhotos (die alle Fotos der Galerie zeigen) befinden sich in einem anderen ViewPager in FragmentGallery. Jetzt, wenn ich auf das Foto klicke und zu FragmentPhotos navigiere (in FragmentGallery), wird die Galerie aktualisiert und ein kürzlich angeklicktes Bild angezeigt (nur zum ersten Mal), aber wenn ich auf weitere Bilder klicke und zu FragmentPhotos zurückkehre (in FragmentGallery) die Galerie doesn 't wird aktualisiert !!! Auch wenn ich auf einen anderen Tab (anders als Tab1, Tab2 und Tab3 zB Tab4 oder Tab5) ziehe, dh wenn der ViewPager zerstört wird, dann wird die Galerie jedes Mal ohne Probleme aktualisiert !!! Bitte helfen Sie mir, wie Sie das Fragment in ViewPager aktualisieren. Obwohl ich versucht habe, es mit notifysetchanged zu aktualisieren, aber es hatte keine Wirkung.

der Galerie zu initiieren ich die initGallery nenne() von MainActivity auf Tab-Auswahl (wenn die ausgewählte Registerkarte ist die Galerie Fragment), wie:

ViewPager viewPager = (ViewPager) findViewById(R.id.pagerGallery); 
        GalleryViewPagerAdapter adapter = (GalleryViewPagerAdapter) viewPager.getAdapter(); 
        for (int i = 0; i < adapter.getCount(); i++) { 
         Fragment fragmentObject = (Fragment) viewPager.getAdapter().instantiateItem(viewPager, i); 
         if (fragmentObject instanceof FragmentPhotos) { 
          FragmentPhotos fragment = (FragmentPhotos) fragmentObject; 
          if (fragment != null) { 
           ((FragmentPhotos) fragment).initGallery(); 
           Log.e("", "Gallery called"); 
          } 
         } 
        } 

und die folgende ist mein PagerAdpater:

public class GalleryViewPagerAdapter extends FragmentStatePagerAdapter { 
    private final List<Fragment> mFragments = new ArrayList<>(); 
    private final List<String> mFragmentTitles = new ArrayList<>(); 
    int numOfTabs; 

    public GalleryViewPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    public void addFragment(Fragment fragment, String title) 
    { 
     mFragments.add(fragment); 
     mFragmentTitles.add(title); 
    } 

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

    @Override 
    public Fragment getItem(int position) { 
     return mFragments.get(position); 
    } 

    @Override 
    public int getCount() { 
     return mFragments.size(); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return mFragmentTitles.get(position); 
    } 
} 

Es folgt initGallery():

public void initGallery() 
    { 
     { 
      new GetImagesFromCard().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
     } 
    } 

und GetImagesFromCard sich wie folgt:

private class GetImagesFromCard extends AsyncTask<Void,LoadedImage,Void> 
    { 
     Bitmap bitmap; 
     ArrayList<LoadedImage> bitmapArrays=new ArrayList<LoadedImage>(); 

     @Override 
     protected Void doInBackground(Void... params) { 
      Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
      String[] projection = {MediaStore.Images.Media.DATE_TAKEN,MediaStore.Images.Media._ID,MediaStore.Images.Thumbnails._ID,MediaStore.Images.Thumbnails.DATA,MediaStore.Images.Media.DATE_TAKEN}; 
      String orderBy = MediaStore.Images.Media.DATE_TAKEN + " DESC"; 
      Cursor cursor = getActivity().getContentResolver().query(uri, projection, null, null, orderBy); 
      int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID); 
      int size = cursor.getCount(); 
      if (size==0) 
      { 

      } 
      int imageId =0; 
      int i=0; 
      while (i<size && !isCancelled()) 
      { 
       cursor.moveToPosition(i); 
       imageId = cursor.getInt(columnIndex); 
       uri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + imageId); 
       publishProgress(new LoadedImage(uri.toString())); 
       if (i==0) 
       { 
        new ShowImagesEnlarged(i).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
       } 
       i++; 
      } 
      cursor.close(); 
      return null; 
     } 

     @Override 
     protected void onProgressUpdate(LoadedImage... values) { 
      super.onProgressUpdate(values); 
      for (LoadedImage photo: values) 
      { 
       imageAdapter.addPhoto(photo); 
       imageAdapter.notifyDataSetChanged(); 
       bitmapArrays.add(photo); 
      } 
     } 

     @Override 
     protected void onCancelled() { 
      Log.e("","Task Cancelled"); 
      super.onCancelled(); 
     } 
    } 
+0

bitte etwas Code zeigen, ich nehme an, Sie nicht über die Galerie Fragmente aktualisieren Inhalt, nachdem Sie gemacht ein Foto.Das erste Mal, wenn das Galeriefragment erstellt wird, lädt es alle Informationen aus der Galerie, danach wird das zwischengespeicherte Fragment innerhalb des Adapters angezeigt ... Also bitte Code aus der Fragment Instanziierung und dem Viewpager-Adapter ... – David

+0

Jetzt können Sie helfen Ich @David –

Antwort

1

Schreib diese Zeile, in FragmentPagerAdapter erweitern oder FragmentStatPagerAdapter

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

es wird automatisch Fragment aktualisiert, wenn Sie ein Fragment zu einem anderen Swipe in Ihrem viewPager oder andernfalls können Sie ein Fragment wie dieses anhängen und loslösen

Dies wird aktuelle Fragment aktualisieren:

FragmentTransaction ft = getFragmentManager().beginTransaction(); 
ft.detach(this).attach(this).commit(); 

Anmerkung: Sie müssen diesen Code setzen in einem einmaligen Ereignisse wie wenn die Daten anderweitig aufgefrischt werden Ihre App wird zu viel hängen .. nur in onCreat und onCreatView Methode schreibt nicht

+0

Dies wird funktionieren, aber nach meiner Erfahrung ist es effizienter, etwas wie das Erstellen einer Schnittstelle für Inhalt refreshable Fragmente zu machen und sie in den Adapter, wenn etwas aktualisiert werden müssen, könnten Sie updateContent() direkt und vielleicht einfach aufrufen Aktualisieren Sie den Inhalt der Gallerielistenadapter, damit das Fragment nicht neu erstellt werden muss. – David

+0

gute Wahl ist deins .. Sie haben gefragt, so habe ich Ihnen nur eine Lösung, die, was ich denke, ist gut .. glücklich Codierung .. –

+0

Ich habe bereits die getItemPosition in FragmentStatePagerAdapter, aber es funktioniert nicht! –

0

Okay, was ich würde vorschlagen, dass Sie eine Schnittstelle wie folgt erstellen:

public interface IContentRefreshableFragment { 
    void refreshContent() 
} 

Alle Ihre Fragmente sollten diese Schnittstelle zB implementieren:

public class FragmentPhoto implements IContentRefreshableFragment { 
    @Override 
    public void refreshContent() { 
     // You have to refresh your dataset here and push it into your 
     // adapter, don't forget to call adapter.notifiyDataSetChanged(); 
     initGallery(); 
    } 
} 

Dann starten Sie Ihr Intent für ein Foto mit einem Result unter:

public static final String PHOTO_TAKEN = "PHOTO_TAKEN";  
startActivityForResult(PhotoActivity.class, PHOTO_TAKEN); 

Danach in Ihrem onActivityResult(...) in Ihrer Aktivität Dich für die Result überprüfen und Inhalt refresh auslösen:

@Override 
public void onActivityResult(..., String requestCode) { 
    if(requestCode.equals(PHOTO_TAKEN) { 
     adapter.refreshContent(); 
    } 
} 

Und in Ihrem Adapter : So können Sie th

public class GalleryViewPagerAdapter extends FragmentStatePagerAdapter { 
    private List<IContentRefreshableFragment> mFragments; 

    public void refreshContent() { 
     for(IContentRefreshableFragment fragment : mFragments) { 
      fragment.refreshContent(); 
     } 
    } 
} 

ohne neu zu erstellen ein paar ViewPagerFragments Inhalt refreshs Griff e Fragmente jedes Mal von jedem Punkt in Ihrem Kontext. Sie können auch Tags zu Ihren Fragmenten hinzufügen und nur einzelne aktualisieren, wenn Sie die Methoden etwas modifizieren.

0

Verwenden getChildFragmentManager() im Konstruktor Ihrer ViewPagerAdapter

ViewPager viewPager = (ViewPager) findViewById(R.id.pagerGallery); 
       GalleryViewPagerAdapter adapter = new GalleryViewPagerAdapter(getChildFragmentManager()); 
       for (int i = 0; i < adapter.getCount(); i++) { 
        Fragment fragmentObject = (Fragment) viewPager.getAdapter().instantiateItem(viewPager, i); 
        if (fragmentObject instanceof FragmentPhotos) { 
         FragmentPhotos fragment = (FragmentPhotos) fragmentObject; 
         if (fragment != null) { 
          ((FragmentPhotos) fragment).initGallery(); 
          Log.e("", "Gallery called"); 
         } 
        } 
       } 

Es gibt ein Problem mit ein paar Tipps in https://code.google.com/p/android/issues/detail?id=55068