這是我使用camera2basic(google示例)捕獲圖像的片段。ViewPager中的片段沒有被刷新
而這種方法,我用更新了最新拍攝的圖像畫廊:
private void refreshGallery(File file)
{
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(Uri.fromFile(file));
getActivity().sendBroadcast(intent);
}
這是畫廊片段我在哪裏顯示了存儲的所有圖片在SD卡中:
這裏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();
}
}
一些提示一個問題,顯示一些代碼,請,我想你不刷新畫廊片段內容你作出後一張照片。第一次創建圖庫片段時,它會加載圖庫中的所有信息,之後您看到的片段是適配器內的緩存圖片...因此,請提供片段實例化代碼和視圖頁適配器... – David
現在,您可以幫助我@David –