Android 如何在ListView中显示许多图片?

Android 如何在ListView中显示许多图片?,android,android-listview,android-image,Android,Android Listview,Android Image,我有一个应用程序-简单文件管理器,它使用MediaStore.video.thumbnails.getThumbnail()和MediaStore.Images.thumbnails.getThumbnail()显示图片和视频的缩略图。但它在有很多图片的目录中运行缓慢。如何修复它 代码的一部分: private ArrayList<File> filesList = new ArrayList<File>(); // ... class FilesListAdapte

我有一个应用程序-简单文件管理器,它使用MediaStore.video.thumbnails.getThumbnail()和MediaStore.Images.thumbnails.getThumbnail()显示图片和视频的缩略图。但它在有很多图片的目录中运行缓慢。如何修复它

代码的一部分:

private ArrayList<File> filesList = new ArrayList<File>();

// ...

class FilesListAdapter extends BaseAdapter {

    // ...

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        File file = filesList.get(position); 

        Bitmap thumbnailBitmap = null;
        ContentResolver crThumb = getContentResolver();
        convertView = LayoutInflater.from(mContext).inflate(mResource, parent, false);
        ImageView thumbnail = (ImageView) convertView.findViewById(R.id.thumbnail);

        if (file.isDirectory()) {
            thumbnail.setImageResource(R.drawable.efp__ic_folder);
        } else {
            if (Build.VERSION.SDK_INT >= 5) {
                try {
                    if (Arrays.asList(videoExtensions).contains(getFileExtension(file.getName()))) {
                        Cursor cursor = crThumb.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Video.Media._ID }, MediaStore.Video.Media.DATA + "='" + file.getAbsolutePath() + "'", null, null);
                        if (cursor != null) {
                            if (cursor.getCount() > 0) {
                                cursor.moveToFirst();
                                thumbnailBitmap = MediaStore.Video.Thumbnails.getThumbnail(crThumb, cursor.getInt(0), MediaStore.Video.Thumbnails.MICRO_KIND, null);
                            }
                            cursor.close();
                        }
                    } else if (Arrays.asList(imagesExtensions).contains(getFileExtension(file.getName()))) {
                        Cursor cursor = crThumb.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Images.Media._ID }, MediaStore.Images.Media.DATA + "='" + file.getAbsolutePath() + "'", null, null);
                        if (cursor != null) {
                            if (cursor.getCount() > 0) {
                                cursor.moveToFirst();
                                thumbnailBitmap = MediaStore.Images.Thumbnails.getThumbnail(crThumb, cursor.getInt(0), MediaStore.Images.Thumbnails.MINI_KIND, null);
                            }
                            cursor.close();
                        }
                    }
                } catch(Exception e) {
                    e.printStackTrace();
                } catch (Error e) {
                    e.printStackTrace();
                }
            }
            if (thumbnailBitmap == null) thumbnail.setImageResource(R.drawable.efp__ic_file);
            else thumbnail.setImageBitmap(thumbnailBitmap);
        }

        // ...

        return convertView;
    }

}
private ArrayList filesList=new ArrayList();
// ...
类FileListAdapter扩展了BaseAdapter{
// ...
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
File File=filesList.get(位置);
位图缩略图位图=空;
ContentResolver crThumb=getContentResolver();
convertView=LayoutFlater.from(mContext).充气(mResource,parent,false);
ImageView缩略图=(ImageView)convertView.findViewById(R.id.缩略图);
if(file.isDirectory()){
setImageResource(R.drawable.efp\u ic\u文件夹);
}否则{
如果(Build.VERSION.SDK_INT>=5){
试一试{
if(Arrays.asList(videoExtensions).contains(getFileExtension(file.getName())){
Cursor Cursor=crThumb.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,新字符串[]{MediaStore.Video.Media.ID},MediaStore.Video.Media.DATA++“=”+file.getAbsolutePath()+”,null,null);
如果(光标!=null){
if(cursor.getCount()>0){
cursor.moveToFirst();
thumbnailBitmap=MediaStore.Video.Thumbnails.getThumbnail(crThumb,cursor.getInt(0),MediaStore.Video.Thumbnails.MICRO_-KIND,null);
}
cursor.close();
}
}else if(Arrays.asList(imagesExtensions).contains(getFileExtension(file.getName())){
Cursor Cursor=crThumb.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,新字符串[]{MediaStore.Images.Media.ID},MediaStore.Images.Media.DATA++“=”+file.getAbsolutePath()+”,null,null);
如果(光标!=null){
if(cursor.getCount()>0){
cursor.moveToFirst();
thumbnailBitmap=MediaStore.Images.Thumbnails.getThumbnail(crThumb,cursor.getInt(0),MediaStore.Images.Thumbnails.MINI_KIND,null);
}
cursor.close();
}
}
}捕获(例外e){
e、 printStackTrace();
}捕获(错误e){
e、 printStackTrace();
}
}
if(thumbnailBitmap==null)thumbnail.setImageResource(R.drawable.efp\u ic\u文件);
else缩略图.setImageBitmap(thumbnailBitmap);
}
// ...
返回视图;
}
}
下面是完整的代码,如果需要的话:

您应该阅读 特别是关于从UI线程加载图像的部分

您可以从提供的示例项目(BitmapFun)中获取并改编大量代码


(我以前也遇到过同样的问题,使用这种策略对我帮助很大;-)

我过去一直在努力解决图像加载问题,但我的所有应用程序都无法正常运行。 然后就出来了

如果你的应用程序使用大量位图,我强烈建议你使用这个库。
它将为您节省大量的工作

一般来说,调用外部内存资源是一项昂贵的操作,一种可能的优化方法是在单独的线程上初始化
filesList
后,立即将所有图像从
filesList
传输到内部(操作)内存,然后将它们加载到各自的ImageView中。再说一遍,我不知道它们是什么类型的图片,如果它们的尺寸很大,这可能不是一个好的解决方案。@NitroNbg,谢谢你的回答!它可以有任何图像-从小到大。请看这里的截图: