jeasonlzy / ImagePicker

完全仿微信的图片选择,并且提供了多种图片加载接口,选择图片后可以旋转,可以裁剪成矩形或圆形,可以配置各种其他的参数

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

图片选择页,按home息屏后再回来,图片一张都不显示了,这个是怎么回事?

tongzhaoxin opened this issue · comments

在onLoadFinished(Loader loader, Cursor data)方法中遍历图片之前添加如下代码就好来了
data.moveToFirst();

moveToFirst 会导致第一张图片丢失,除非再moveToFirst后再重新解析一下数据,还有就是这种处理方式会导致返回后数据刷新的问题,可以在onLoadFinished中删除loader, activity.getSupportLoaderManager().destroyLoader(LOADER_ALL);

commented


while(data.moveToNext()){
}
换成
data.moveToFirst();
do{
}while(data.moveToNext());

moveToFirst 会导致第一张图片丢失,除非再moveToFirst后再重新解析一下数据,还有就是这种处理方式会导致返回后数据刷新的问题,可以在onLoadFinished中删除loader, activity.getSupportLoaderManager().destroyLoader(LOADER_ALL);

大神,那这行代码是要加在哪个地方,小白看不懂源码,方便把解决方案贴出完整的代码吗,用其他的确实可以解决,不过正如你所说的返回后又刷新了,你的方案应该更好

moveToFirst 会导致第一张图片丢失,除非再moveToFirst后再重新解析一下数据,还有就是这种处理方式会导致返回后数据刷新的问题,可以在onLoadFinished中删除loader, activity.getSupportLoaderManager().destroyLoader(LOADER_ALL);

我是加在这个方法的最下面,不知道这样是对不对的
//回调接口,通知图片数据准备完成
ImagePicker.getInstance().setImageFolders(imageFolders);
loadedListener.onImagesLoaded(imageFolders);
activity.getSupportLoaderManager().destroyLoader(LOADER_ALL);

commented

ImageDataSourse.java 的onLoadFinished改成这样就行了

@Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        imageFolders.clear();
        if (data != null) {
            ArrayList<ImageItem> allImages = new ArrayList<>();   //所有图片的集合,不分文件夹
            data.moveToFirst();
            do {
                //查询数据
                String imageName = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[0]));
                String imagePath = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[1]));
                
                File file = new File(imagePath);
                if (!file.exists() || file.length() <= 0) {
                    continue;
                }

                long imageSize = data.getLong(data.getColumnIndexOrThrow(IMAGE_PROJECTION[2]));
                int imageWidth = data.getInt(data.getColumnIndexOrThrow(IMAGE_PROJECTION[3]));
                int imageHeight = data.getInt(data.getColumnIndexOrThrow(IMAGE_PROJECTION[4]));
                String imageMimeType = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[5]));
                long imageAddTime = data.getLong(data.getColumnIndexOrThrow(IMAGE_PROJECTION[6]));
                //封装实体
                ImageItem imageItem = new ImageItem();
                imageItem.name = imageName;
                imageItem.path = imagePath;
                imageItem.size = imageSize;
                imageItem.width = imageWidth;
                imageItem.height = imageHeight;
                imageItem.mimeType = imageMimeType;
                imageItem.addTime = imageAddTime;
                allImages.add(imageItem);
                //根据父路径分类存放图片
                File imageFile = new File(imagePath);
                File imageParentFile = imageFile.getParentFile();
                ImageFolder imageFolder = new ImageFolder();
                imageFolder.name = imageParentFile.getName();
                imageFolder.path = imageParentFile.getAbsolutePath();

                if (!imageFolders.contains(imageFolder)) {
                    ArrayList<ImageItem> images = new ArrayList<>();
                    images.add(imageItem);
                    imageFolder.cover = imageItem;
                    imageFolder.images = images;
                    imageFolders.add(imageFolder);
                } else {
                    imageFolders.get(imageFolders.indexOf(imageFolder)).images.add(imageItem);
                }
            } while (data.moveToNext());
            //防止没有图片报异常
            if (data.getCount() > 0 && allImages.size()>0) {
                //构造所有图片的集合
                ImageFolder allImagesFolder = new ImageFolder();
                allImagesFolder.name = activity.getResources().getString(R.string.ip_all_images);
                allImagesFolder.path = "/";
                allImagesFolder.cover = allImages.get(0);
                allImagesFolder.images = allImages;
                imageFolders.add(0, allImagesFolder);  //确保第一条是所有图片
            }
        }

        //回调接口,通知图片数据准备完成
        ImagePicker.getInstance().setImageFolders(imageFolders);
        loadedListener.onImagesLoaded(imageFolders);
    }