android-fragments 滑音未“自动”显示第一个片段中的图像

sh7euo9m  于 2022-11-13  发布在  Android
关注(0)|答案(1)|浏览(121)

在我的应用程序中,我可以用照片创建相册,将它们存储在Firebase上并查看它们。
嗯,为了浏览这些相册,我决定创建一些东西,比如在Play商店中全屏查看应用程序/游戏的截图。我创建了Activity,并将ViewPager2添加到这个Activity中,然后我创建了FragmentAdapter来显示我的图像,一切似乎都能正常工作,但Glide存在一些问题。
首先,我尝试使用以下代码加载照片:Glide.with(MediaViewerFragment.this).load(imageUrl).into(image);,但图片没有显示。
在stackoverflow上,我找到了一个解决方案--在方法中添加一个侦听器,使用submit()代替into(View)。因此,我编写了这样一个侦听器:

RequestListener<Drawable> listener = new RequestListener<>() {
            @Override
            public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                errorLinear.setVisibility(View.VISIBLE);
                errorReasonText.setText(e.getMessage());
                loadingLinear.setVisibility(View.GONE);
                Log.d("Test", "Glide: Cannot load image: " + e.getMessage());
                return false;
            }

            @Override
            public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                image.setImageDrawable(resource);
                image.invalidate();
                loadingLinear.setVisibility(View.GONE);
                Log.d("Test", "Glide: Image loaded");
                return false;
            }
        };

        Glide.with(MediaFragment.this).load(imageUrl).addListener(listener).submit();

但是:

  • 当我打开相册时,第一个片段中的照片在加载后不会立即显示,只有当我用手指触摸ViewPager 2或滚动到下一个片段并返回到第一个片段时,图像才会“加载到imageview”。
  • ProgressBar不会在第一个片段上消失

我不知道为什么会这样,我认为这是因为第一个滑翔听众在其他片段中被其他听众取代开始?
正如你所看到的,在OnResourceReady中我有Log.d("Test", "Glide: Image loaded");,但是它并没有出现在LogCat中(在第一个片段上,当我滑动到其他片段时,一切都正常!)。但是当我把Log.d("Test", "Glide: Image loaded");放在上面时,它看起来会像这样:

@Override
            public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                Log.d("Test", "Glide: Image loaded");
                image.setImageDrawable(resource);
                image.invalidate();
                loadingLinear.setVisibility(View.GONE);
                return false;
            }

然后:

  • 当我打开相册,然后立即在logcat我得到我的消息,照片已上传,但不幸的是,我仍然看不到它和ProgressBar没有消失。
  • 我仍然需要滑动到下一个片段,然后返回到上一个片段才能看到该图像。

Video describing the problem-您可以看到,我必须触摸屏幕才能加载照片,这很奇怪,不应该发生
MediaViewerFragment.java

public class MediaViewerFragment extends Fragment {
    View mRootView;

    private ImageView image;
    private LinearLayout errorLinear, loadingLinear;
    private MaterialTextView errorReasonText;

    private String imageUrl;

    private Context context;

    @Override
    public void onDestroyView() {
        context = null;
        super.onDestroyView();
    }

    public MediaViewerFragment(Context context, String imageUrl) {
        this.imageUrl = imageUrl;
        this.context = context;
        Log.d("Teest", "MediaFragment - Image to load: " + imageUrl);
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mRootView = inflater.inflate(R.layout.fragment_media, container, false);
        return mRootView;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        initView();
        setup();
    }

    private void initView() {
        image = mRootView.findViewById(R.id.image);
        errorLinear = (LinearLayout) mRootView.findViewById(R.id.error_linear);
        errorReasonText = (MaterialTextView) mRootView.findViewById(R.id.error_reason_text);
        loadingLinear = mRootView.findViewById(R.id.loading_progress_bar);
    }

    private void setup() {
        Log.d("Test", "Preparing to load image: " + imageUrl);

        RequestListener<Drawable> listener = new RequestListener<>() {
            @Override
            public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                errorLinear.setVisibility(View.VISIBLE);
                errorReasonText.setText(e.getMessage());
                loadingLinear.setVisibility(View.GONE);
                Log.d("Test", "Glide: Cannot load image: " + e.getMessage());
                return false;
            }

            @Override
            public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                image.setImageDrawable(resource);
                image.invalidate();
                loadingLinear.setVisibility(View.GONE);
                Log.d("Test", "Glide: Image loaded");
                return false;
            }
        };

        Glide.with(MediaViewerFragment.this)load(imageUrl).addListener(listener).submit();
    }
}

ViewPager适配器:

public class MediaViewerViewPager extends FragmentStateAdapter {
    private List<AlbumImage> imagesUrls;

    private Context context;

    public MediaViewerViewPager(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle, Context context, List<AlbumImage> imagesUrls) {
        super(fragmentManager, lifecycle);
        this.imagesUrls = imagesUrls;
        this.context = context;
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return new MediaFragment(context, imagesUrls.get(position).getImageUrl());
    }

    @Override
    public int getItemCount() {
        return imagesUrls.size();
    }
}

我的ViewPager 2所在的活动:

public class MediaViewerActivity extends AppCompatActivity {
    private ViewPager2 imagesViewpager;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_media_viewer);

        initView();
        setup();
    }

    private void initView() {
        imagesViewpager = (ViewPager2) findViewById(R.id.images_viewpager);
    }

    private void setup() {
        MediaViewerViewPager adapter = new MediaViewerViewPager(getSupportFragmentManager(), getLifecycle(), MediaViewerActivity.this, new Gson().fromJson(getIntent().getStringExtra("albumImages"), new TypeToken<List<AlbumImage>>() {}.getType()));
        imagesViewpager.setAdapter(adapter);
    }
}

固定

placeholdererror方法添加到代码中之后,一切都正常了。正确的代码如下所示:

Glide.with(image)
                .load(getImageUrl())
                .placeholder(R.drawable.transparent_background)
                .error(R.drawable.transparent_background)
                .addListener(new RequestListener<Drawable>() {
                    @Override
                    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                        loadingLinear.setVisibility(View.GONE);
                        errorLinear.setVisibility(View.VISIBLE);
                        errorReasonText.setText(e.getMessage());

                        return false;
                    }

                    @Override
                    public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                        loadingLinear.setVisibility(View.GONE);

                        return false;
                    }
                })
                .into(image);
klr1opcd

klr1opcd1#

您是否尝试过使用

Glide.with(View)

并设置placeholder图像和error图像。它可能会让你知道发生了什么!
就像这样-

Glide.with(view)
       .load(imageUrl)
       .error(R.drawable.someErrorImage)
       .placeholder(R.drawable.somePlaceHolderImage)
       .into(view);

相关问题