当前位置: 首页 > 知识库问答 >
问题:

从SD卡查询图像并在GridView中显示

钱京
2023-03-14

我正在努力解决这个问题。我有一些代码使用游标加载程序从SD卡查询图像,并在SimpleCorsorAdapter的帮助下在GridView中显示它们。我在网上看了一些例子,并通读了文档。我知道我做对了。代码运行时没有任何错误,但是我无法将缩略图显示在网格上。以下是我目前获得的代码:

GalleryFragment.java

public class GalleryFragment extends Fragment {

    private SimpleCursorAdapter adapter;
    public static final int PHOTO_LIST_ID = 0x01;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_gallery, container, false);
        // Bind adapter to grid
        setupCursorAdapter();
        // Initialize the loader with a special ID and the defined callbacks
        getLoaderManager().initLoader(PHOTO_LIST_ID,
                new Bundle(), imageLoader);
        GridView gridView = (GridView) view.findViewById(R.id.gridView);
        gridView.setAdapter(adapter);
        return view;

    }

    private void setupCursorAdapter() {
        String[] from = {MediaStore.Images.Thumbnails.DATA};
        int[] to = {R.id.imageView};
        adapter = new SimpleCursorAdapter(getActivity().getBaseContext(),
                R.layout.gallery_image_item,
                null, from, to,
                0);
    }

    private LoaderManager.LoaderCallbacks<Cursor> imageLoader =
            new LoaderManager.LoaderCallbacks<Cursor>() {

                @Override
                public Loader<Cursor> onCreateLoader(int id, Bundle args) {
                    // Define the columns to retrieve
                    String[] projection = {MediaStore.Images.Thumbnails._ID,
                        MediaStore.Images.Thumbnails.DATA};
                    return new CursorLoader(getActivity(),
                            MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,
                            projection, null, null, null);
                }

                @Override
                public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
                    adapter.swapCursor(data);
                }

                @Override
                public void onLoaderReset(Loader<Cursor> loader) {
                    adapter.swapCursor(null);
                }
            };
}

fragment\u gallery.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="edu.sfsu.csc780.pictachio.GalleryFragment">

    <GridView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/gridView"
        android:numColumns="auto_fit"
        android:verticalSpacing="10dp"/>

</LinearLayout>

gallery\u image\u item.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <ImageView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/imageView"
        android:padding="10dp"
        android:adjustViewBounds="true"
        android:contentDescription="ImageView" />
</FrameLayout>

我在很多地方读到,建议使用RecyclerView而不是GridView。我已经试过了,但我不知道该创建什么样的模型。感谢您的帮助。谢谢

共有2个答案

乐正宏深
2023-03-14

最好的方法是使用最近的图像库。它是如此简单。只需将库依赖项添加到项目中,然后将下面的行添加到类中。适配器已准备好,您可以为gridview设置它。

RecentImages ri = new RecentImages();
ImageAdapter adapter = ri.getAdapter(MainActivity.this);

它有一些选项用于自定义图像查询。

夏侯星洲
2023-03-14

我不明白使用getLoaderManager()和initLoader()来获取图像。一种方法是从SQLite数据库中获取它们。一个合适的谷歌留档是@SQL查询。我提供了一个使用该查询方法的示例代码。但是我从来没有在Android中获取图像。

Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String[] cols = new String[]{
                MediaStore.Images.Media.DATA,  // get the image
};
//String where = MediaStore.Images.Media.DATA;

Cursor cursor = getContentResolver().query(uri, cols, null, null, null);
if(cursor.moveToFirst()) {
   int column_image = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
   res = cursor.getString(column_image);
}
cursor.close();

笔记:

  • 查询的第三和第四个参数有助于过滤返回的数据

试试看,让我们知道会发生什么。

 类似资料:
  • 我正在尝试制作一个选项卡,其中我必须在gridview中显示图像,所以我从一个库中制作了普通选项卡,并制作了一个适配器来显示我的主要活动代码中的图像。 我的片段类。 我已将适配器设置如下: 我能够在活动中创建网格视图,但是我用它来声明类中的图像,但在这里我遇到了错误。我在适配器中声明为适配器将调用图像的 Sso。它正确编译,没有任何错误,但它显示运行时错误错误为 那么如何解决这个问题,我必须声明图

  • 我想在GridView中显示图像列表。但我做不到。我想知道资产中图像列表的数据类型,以及构造函数在这种情况下的帮助。我刚刚开始学习颤振,我不知道如何使用它。

  • 问题内容: 我正在尝试从设备sd卡加载png图像作为可绘制图像。我使用以下功能,但不起作用: 图像路径为:mnt / sdcard / MyFolder / image.png 当我尝试调用该方法时,应用程序崩溃了,我该如何加载位于sdcard中的png图像并将其转换为Drawable对象? 问题答案: 实际上,直接在文件路径中有一个BitmapDrawable构造函数。您正在使用的方法已被描述。

  • 问题内容: 我希望能够从Android设备的内部缓存中移动或复制文件,并将其放入SD卡上的永久存储区。这是我到目前为止所拥有的: 问题答案:

  • 但是宽度和高度较低的图像成功地加载到图像视图中! 有人能告诉我代码有什么问题吗?我做错了什么?我只想从库中导入相机图像,并在图像视图中显示它们!

  • 问题内容: 我需要在手机中打开我的画廊,然后选择一张在活动中在imageview中打开的图片..没什么困难..但是我在模拟器(genymotion)中有完美的代码和thise代码可以运行..但是在小米Mi4上却没有。 打开画廊选择项目,什么也没有。 我没有更多的电话了:( 我尝试下载一些与此主题相关的示例,并且每个示例都是相同的。 您是否有一些从图库中选择图像并在imageview中显示的项目?如