1

這是我使用camera2basic(google示例)捕獲圖像的片段。ViewPager中的片段沒有被刷新

enter image description here

而這種方法,我用更新了最新拍攝的圖像畫廊:

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

這是畫廊片段我在哪裏顯示了存儲的所有圖片在SD卡中:

enter image description here

這裏MainActivity由具有ViewPager,其具有5個片段

  • FragmentHome
  • FragmentGallery
  • FragmentCamera
  • FragmentStar
  • FragmentProfile

和內部FragmentGallery,有一個由具有2個片段另一個ViewPager(GalleryViewPager):

  • FragmentPhotos
  • FragmentVideos

現在你可以看到,該CameraFragment處於ViewPager MainActivity和FragmentPhotos(顯示圖庫的所有照片)位於FragmentGallery中的另一個ViewPager中。 現在,當我點擊照片並導航到FragmentPhotos(FragmentGallery內)時,畫廊得到更新,最近點擊圖片顯示(僅限第一次),但當我點擊更多圖片並返回FragmentPhotos(FragmentGallery內)該畫廊doesn不會更新 !!!另外,當我移動到不同的選項卡(Tab1,Tab2和Tab3,即Tab4或Tab5除外),即當ViewPager被破壞時,圖庫每次都會更新而不會有任何問題! 請幫助我,如何更新ViewPager中的片段。 雖然我試圖用notifysetchanged更新它,但它沒有效果。

要啓動圖庫我打電話從MainActivity的initGallery()選項卡上的選擇(當選擇的標籤是畫廊片段),如:

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

和下面是我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); 
    } 
} 

以下是initGallery():

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

和GetImagesFromCard如下:

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

一些提示一個問題,顯示一些代碼,請,我想你不刷新畫廊片段內容你作出後一張照片。第一次創建圖庫片段時,它會加載圖庫中的所有信息,之後您看到的片段是適配器內的緩存圖片...因此,請提供片段實例化代碼和視圖頁適配器... – David

+0

現在,您可以幫助我@David –

回答

1

寫這條線,你延長FragmentPagerAdapter或FragmentStatPagerAdapter

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

當您在viewPager或輕掃一個片段到另一個它會自動刷新片段否則你可以像這樣附加和分離片段

這將刷新當前片段:

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

記:你必須把這個代碼,當數據被刷新就像一個一次性事件,否則您的應用程序會掛太多..只是不要在onCreat和onCreatView方法寫

+0

這會工作,但根據我的經驗,更有效的做法是創建一個內容可刷新片段的接口,並將其放入適配器,當需要刷新某些內容時,可以直接調用updateContent(),也許只是刷新畫廊列表適配器的內容,所以不必重新創建片段。 – David

+0

不錯的選擇是你的..你問的問題,所以我只是給你一個解決方案,我認爲是好的..快樂編碼.. –

+0

我已經把getItemPosition在FragmentStatePagerAdapter,但它不工作! –

0

好吧我什麼建議是,你創建一個這樣的接口:

public interface IContentRefreshableFragment { 
    void refreshContent() 
} 

您所有的碎片都應該實現這個接口,例如:

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

然後你開始你的意圖拍照的用的ResultCode:

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

之後,在你onActivityResult(...)在你的活動,你檢查的的ResultCode和觸發內容刷新:

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

而在你的適配器:

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

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

所以,你可以處理一堆ViewPagerFragments內容refreshs無需重新創建日e每一次從你的上下文中的任何一個時間片段。 你也可以添加標籤到你的片段,並刷新只是單一的,如果你修改方法一點。

0

使用getChildFragmentManager()在你的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"); 
         } 
        } 
       } 

有在https://code.google.com/p/android/issues/detail?id=55068