Skip to content

常见问题

FlyJingFish edited this page Oct 16, 2023 · 11 revisions

1、聊天页面RecyclerView(ListView)中的数据除了图片和视频还有其他数据,该怎么使用?

  • 答:数据无需筛选掉其他数据(所有数据需要实现 OpenImageUrl 接口),然后所有适配器中的数据直接传入即可,其他数据的 getType 返回 MediaType.NONE

2、我想传入RecyclerView(ListView)的适配器中没有的数据,该怎么使用?

  • 答: 传入RecyclerView(ListView)之后调用 setClickPosition(int clickDataPosition, int clickViewPosition)即可。参数该怎么传呢?

    • 答案是 如果你想传很多图片或视频数据包括 RecyclerView(ListView)的适配器中的没有的数据,那么clickDataPosition就是当前点击的View显示的数据在您所传数据中的位置(就是调用setImageUrlList所传数据中的位置),clickViewPosition依旧是点击的位置(适配器中的位置)。
  • PS:另外很重要的一点,在适配器中不是图片或视频的也需要把这部分数据传进来,MediaType返回NONE,因为要让数据和View的位置有个对应关系。详细可以看Demo MsgLvAdapter

3、调用setClickImageView有时候返回时没有返回效果

  • 答:大多数是因为ImageView所在的容器刷新了,例如RecyclerView的Adapter刷新后ImageView就会被回收,页面在返回时已经找不到传入的ImageView了,所以就没有效果了,这种情况下强烈建议不采用这种方式,而是传入所在的容器,如果点击的ImageView是在RecyclerView(ListView、ViewPager、ViewPager2)中,可以参考问题2。

4、我想要微信那种当前屏幕上的图片返回时如果不在屏幕,自动回位到点击位置,该怎么做?

  • 答:调用setWechatExitFillInEffect传入true,就可以获得这个效果了

5、我想要新浪微博那种当前查看图片下拉时(或返回时),前一页面不显示当前这张图片,该怎么做?

  • 答:调用setShowSrcImageView传入false,就可以获得这个效果了

6、引用 OpenImageGlideLib 之后和您项目中的Glide版本冲突

  • 答:本项目用的 Glide 版本是 4.12.0 如果您项目中的版本低于这个版本可以升级至这个版本及其以上或者引用OpenImageLib自定义版本号

7、引用 OpenImageFullLib 之后和您项目中的Glide版本冲突

  • 答:本项目用的 Glide 版本是 4.12.0 如果您项目中的版本低于这个版本可以升级至这个版本及其以上或者引用OpenImageLib自定义版本号

8、引用 OpenImageFullLib 之后和您项目中的GSYVideoPlayer版本冲突

  • 答:本项目用的 GSYVideoPlayer 版本是 8.3.3 如果您项目中的版本低于这个版本可以升级至这个版本及其以上或者引用OpenImageLib自定义版本号

9、我的项目中有多种查看大图的UI,该怎么办?

  • A,优先使用OpenImage中的addMoreView去添加您的UI

  • B,您可多次实现ImageFragmentCreate接口和BaseImageFragment页面,并且在调用显示的地方调用OpenImage中的setImageFragmentCreate设置即可

10、我的项目中有多种查看视频的UI,该怎么办?

  • A,优先使用OpenImage中的addMoreView去添加您的UI

  • B,您可多次实现VideoFragmentCreate接口和BaseImageFragment页面,并且在调用显示的地方调用OpenImage中的setVideoFragmentCreate设置即可

11、上边的9、10提到的方式还不能满足你的需求,该怎么办?

12、使用OpenImageLib自定义大图引擎,出现 内存溢出 或者大图加载不出来 或者 出现 “trying to draw too large(330750000bytes) bitmap” 报错信息,该怎么办?

  • 答:请引用OpenImageGlideLib库,此库针对此问题作出了优化。如果您使用的是Glide之外的图片引擎,可参考OpenImageGlideLib代码

  • 如果你用的是Picasso 可参考

    AppGlideBigImageHelper

    PicassoLoader

13、假如碰到以下几种错误提示

1> 请确保是否调用了setClickPosition并且参数设置正确,或 SourceImageViewIdGet 返回的 ImageView 的Id正确

2> 请确保是否调用了setClickPosition并且参数设置正确,SourceImageViewGet 返回的 ImageView 不能为null

3> 请确保是否调用了setClickPosition并且参数设置正确,或所传ImageView个数是否正确

这说明无法正确获取到点击的ImageView,原因有以下几个请自行排查

1> 确保数据正确设置了数据类型,如果你的数据实现了 OpenImageUrl 接口,并且正确重写了 getType ,返回的类型也是对的

2> 确保 setClickPosition 设置的位置正确,请仔细参阅读上边的 问题2 来排查问题原因

3> 所传 View 数量小于 setClickPosition 所设置的位置(即数据和View数量不相等时),请参考上边的 问题2 来排查问题原因

4> 确保返回的图片 id 是正确的,如果你的列表中有多个图片Id,请根据您的实际情况自行排查问题,
   例如以下代码是因为视频和图片的ImageView 的 Id 不一样

 
    new SourceImageViewIdGet<OpenImageUrl>() {
        @Override
        public int getImageViewId(OpenImageUrl data, int position1) {
            MessageBean msgBean = (MessageBean) data;
            //图片和视频显示的 ImageView 的 id 不一样也可以,根据数据类型返回即可
            if (msgBean.type == MessageBean.IMAGE){
                return R.id.iv_image;
            }else {
                return R.id.iv_video;
            }
        }
    }

14、使用 OpenImageCoilLib 想要支持Gif图片怎么做

  • 答: app的module下引入 coil-gif
     implementation("io.coil-kt:coil-gif:2.4.0")
    
    你的 Application 实现 ImageLoaderFactory 并设置它
    public class MyApplication extends Application implements ImageLoaderFactory {
        @NonNull
        @Override
        public ImageLoader newImageLoader() {
           ComponentRegistry.Builder builder = new ComponentRegistry.Builder();
           if (SDK_INT >= 28) {
              builder.add(new ImageDecoderDecoder.Factory());
           } else {
              builder.add(new GifDecoder.Factory());
           }
           return new ImageLoader.Builder(this).logger(new DebugLogger())
               .okHttpClient(CoilLoadImageUtils.INSTANCE.getOkHttpClient())
               .components(builder.build())
           .build();
        }
    }

15、setItemLoadHelper一定要设置吗?

  • 答:这项已被废弃,不用设置
Clone this wiki locally