gpt4 book ai didi

android - ViewPager 内的 fragment 未刷新

转载 作者:行者123 更新时间:2023-11-30 01:09:12 25 4
gpt4 key购买 nike

这是我使用 camera2basic(谷歌示例)捕获图像的 fragment 。

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

这是画廊 fragment ,我在其中展示存储在 SD 卡中的所有图像:

enter image description here

这里 MainActivity 有一个 ViewPager,它有 5 个 fragment :

  • fragment 首页
  • fragment 画廊
  • fragment 相机
  • fragment 之星
  • fragment 简介

在 FragmentGallery 内部,还有一个 ViewPager(GalleryViewPager),它有 2 个 fragment :

  • fragment 照片
  • fragment 视频

现在您可以看到,CameraFragment 在 MainActivity 的一个 ViewPager 中,而 FragmentPhotos(显示画廊的所有照片)在 FragmentGallery 中的另一个 ViewPager 中。现在,当我单击照片并导航到 FragmentPhotos(在 FragmentGallery 内)时,图库会更新并显示最近单击的图片(仅第一次),但当我单击更多图片并返回到 FragmentPhotos(在 FragmentGallery 内)图库没有得到更新 !!!此外,当我移动到不同的选项卡(除了 Tab1、Tab2 和 Tab3,即 Tab4 或 Tab5)时,即当 ViewPager 被销毁时,画廊每次都会毫无问题地更新!!!请帮助我,如何更新 ViewPager 中的 fragment 。虽然我尝试用 notifysetchanged 更新它但是没有效果。

为了启动图库,我在选项卡选择上从 MainActivity 调用 initGallery()(当选定的选项卡是图库 fragment 时),如下所示:

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

最佳答案

在扩展 FragmentPagerAdapter 或 FragmentStatPagerAdapter 的地方写下这一行

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

当您在 viewPager 中将一个 fragment 滑动到另一个 fragment 时,它会自动刷新 fragment ,否则您可以像这样附加和分离 fragment

这将刷新当前 fragment :

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

注意:您必须将此代码放在一次性事件中,例如刷新数据时,否则您的应用程序将挂起太多..只是不要写在 onCreat 和 onCreatView 方法中

关于android - ViewPager 内的 fragment 未刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38588239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com