Android的:如何让有照片的所有文件夹?文件夹、照片、Android

2023-09-04 06:08:57 作者:[┭抽筋魚о]

我试图让一个画廊。我知道如何让所有的照片,并将其显示在网格视图。但有人可以解释如何获取和显示文件夹(附图)?

我已经发动我的apk文件后遇到错误。 PLZ看在我的XML文件,可能是什么错在这里??? gridview.xml:

 < LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
的xmlns:工具=htt​​p://schemas.android.com/tool​​s
机器人:layout_width =FILL_PARENT
机器人:layout_height =FILL_PARENT
机器人:方向=垂直>
    < GridView控件
        机器人:ID =@ + ID / GridView控件
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =WRAP_CONTENT
        机器人:layout_gravity =顶
        机器人:layout_marginBottom = -  10dp
        机器人:layout_marginLeft = -  10dp
        机器人:layout_marginRight = -  10dp
        机器人:layout_marginTop = -  10dp
        机器人:horizo​​ntalSpacing = -  15dp
        机器人:为numColumns =3
        机器人:填充=0dp
        机器人:verticalSpacing = -  15dp>
    < / GridView的>
    < / LinearLayout中>
 

和grid_item:

 < ImageView的
        机器人:ID =@ + ID / ImageView的
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:layout_gravity =右
        机器人:layout_marginRight =2DP
        机器人:layout_marginTop =2DP

        机器人:重力=中心
        机器人:scaleType =中心
         />
 

解决方案

编辑:我扔在一起工作的例子给你。它的工作原理是这样的:

将一个目录内开始(在下面的例子中, /存储/ SD卡/ DCIM / )。如果目录包含任何图像,它们将被显示。如果它包含任何子目录,它将检查,看看他们是否包含任何图片,或者自己的子目录。如果他们这样做,一个文件夹图标将显示。点击文件夹图标将打开文件夹,并显示图像/子目录,它包含的内容。

色彩的变幻 历代Android界面的演变史

请注意,这只是为了给你如何实现它 - 一个粗略的想法,你仍然需要在这方面努力codeA位,以提高效率,特别是在内存使用方面,但我'已经在我的仿真器和code正在运行此。

在你的活动

 公共类MainActivity扩展活动实现OnItemClickListener {

    名单< GridViewItem> gridItems;


    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);

        setGridAdapter(/存储/ SD卡/ DCIM /);
    }


    / **
     *这将创建GridViewItems并设置适配器
     *
     * @参数路径
     *在其中搜索图像目录
     * /
    私人无效setGridAdapter(字符串路径){
        //创建一个新的网格适配器
        gridItems = createGridItems(路径);
        MyGridAdapter适配器=新MyGridAdapter(这一点,gridItems);

        //设置网格适配器
        GridView控件的GridView =(GridView控件)findViewById(R.id.gridView);
        gridView.setAdapter(适配器);

        //设置onClickListener
        gridView.setOnItemClickListener(本);
    }


    / **
     *去通过指定目录下,并创建要显示的项目我们
     * 网格视图
     * /
    私人列表< GridViewItem> createGridItems(字符串目录路径){
        名单< GridViewItem>项目=新的ArrayList< GridViewItem>();

        //列出所有文件夹中的项目。
        文件[]文件=新的文件(目录).listFiles(新ImageFileFilter());
        对于(文件文件:文件){

            //添加含有图片或子目录的目录
            如果(file.isDirectory()
                &功放;&安培; 。file.listFiles(新ImageFileFilter())长度GT; 0){

                items.add(新GridViewItem(file.getAbsolutePath(),真,空));
            }
            //添加图像
            其他 {
                位图图像= BitmapHelper.de codeBitmapFromFile(file.getAbsolutePath()
                                                                 50,
                                                                 50);
                items.add(新GridViewItem(file.getAbsolutePath(),假的,图像));
            }
        }

        返回的项目;
    }


    / **
     *检查文件,看它是否有一个兼容扩展。
     * /
    私人布尔isImageFile(字符串文件路径){
        如果(filePath.endsWith(。JPG)|| filePath.endsWith(。PNG))
        //根据需要添加其他格式
        {
            返回true;
        }
        返回false;
    }


    @覆盖
    公共无效
            onItemClick(适配器视图<>母公司视图中查看,INT位置,长的id){

        如果(gridItems.get(位置).isDirectory()){
            setGridAdapter(gridItems.get(位置).getPath());
        }
        其他 {
            //显示的图像
        }

    }

    / **
     *这可以用于过滤文件。
     * /
    私有类ImageFileFilter实现的FileFilter {

        @覆盖
        公共布尔接受(档案文件){
            如果(file.isDirectory()){
                返回true;
            }
            否则,如果(isImageFile(file.getAbsolutePath())){
                返回true;
            }
            返回false;
        }
    }

}
 

然后你需要创建适配器,它应当扩大BaseAdapter,看这个样子。

 公共类MyGridAdapter扩展了BaseAdapter {

    LayoutInflater充气;
    名单< GridViewItem>项目;


    公共MyGridAdapter(上下文的背景下,名单,其中,GridViewItem>项目){
        this.items =项目;
        充气=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }


    @覆盖
    公众诠释getCount将(){
        返回items.size();
    }


    @覆盖
    公共对象的getItem(INT位置){
        返回items.get(位置);
    }


    @覆盖
    众长getItemId(INT位置){
        返回的位置;
    }


    @覆盖
    公共查看getView(INT位置,查看convertView,ViewGroup中父){

        如果(convertView == NULL){
            convertView = inflater.inflate(R.layout.grid_item,NULL);
        }

        TextView的文字=(TextView的)convertView.findViewById(R.id.textView);
        text.setText(items.get(位置).getPath());

        ImageView的ImageView的=(ImageView的)convertView.findViewById(R.id.imageView);
        位图图像= items.get(位置).getImage();

        如果(图像!= NULL){
            imageView.setImageBitmap(图像);
        }
        其他 {
            //如果没有提供图片,显示一个文件夹图标。
            imageView.setImageResource(R.drawable.your_folder_icon);
        }

        返回convertView;
    }

}
 

你需要创建一个重新presents每个网格项目

 公共类GridViewItem {

    私人字符串路径;
    私人布尔isDirectory;
    私人位图图像;


    公共GridViewItem(字符串路径,布尔isDirectory,位图图像){
        this.path =路径;
        this.isDirectory = isDirectory;
        this.image =图像;
    }


    公共字符串getPath(){
        返回路径;
    }


    公共布尔的isdirectory(){
        返回isDirectory;
    }


    公共位图的getImage(){
        返回形象;
    }
}
 

一类处理图像

 公共抽象类BitmapHelper {

    公共静态位图德codeBitmapFromFile(字符串的ImagePath,
                                              INT reqWidth,
                                              INT reqHeight){

        //第一代code与inJustDe codeBounds = true来检查尺寸
        最后BitmapFactory.Options选项=新BitmapFactory.Options();
        options.inJustDe codeBounds = TRUE;
        BitmapFactory.de codeFILE(的ImagePath,期权);

        //计算inSampleSize
        options.inSampleSize = calculateSampleSize(选项,reqWidth,reqHeight);

        与inSampleSize集//德code位图
        options.inJustDe codeBounds = FALSE;
        返回BitmapFactory.de codeFILE(的ImagePath,期权);
    }


    私有静态诠释calculateSampleSize(BitmapFactory.Options选项,
                                           INT reqHeight,
                                           INT reqWidth){

        //原始高度和宽度的图像
        最终诠释身高= options.outHeight;
        最终诠释宽度= options.outWidth;
        INT inSampleSize = 1;

        如果(高度> reqHeight ||宽度GT; reqWidth){

            最终诠释halfHeight =身高/ 2;
            最终诠释半宽度=宽度/ 2;

            //计算最大inSampleSize值是2的幂和
            //保持两个
            //高度和宽度小于所需的高度和宽度。
            而((halfHeight / inSampleSize)> reqHeight
                   &功放;&安培; (半角/ inSampleSize)> reqWidth){
                inSampleSize * = 2;
            }
        }

        返回inSampleSize;

    }

}
 

activity_main.xml

 < XML版本=1.0编码=UTF-8&GT?;
< GridView中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:ID =@ + ID / GridView控件
    机器人:为numColumns =auto_fit
    机器人:重力=中心
    机器人:columnWidth中=150dp
    机器人:stretchMode =columnWidth中
    机器人:layout_width =FILL_PARENT
    机器人:layout_height =FILL_PARENT>
< / GridView的>
 

grid_item.xml

 < XML版本=1.0编码=UTF-8&GT?;
< RelativeLayout的的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:layout_width =150dp
    机器人:layout_height =150dp
    机器人:填充=5DP>

    < ImageView的
        机器人:ID =@ + ID / ImageView的
        机器人:layout_width =150dp
        机器人:layout_height =150dp
        机器人:scaleType =centerCrop
        机器人:SRC =@可绘制/ andrew_salgado>
    < / ImageView的>

    < RelativeLayout的
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =20dp
        机器人:layout_alignParentBottom =真
        机器人:阿尔法=0.8
        机器人:后台=#000000>

        <的TextView
            机器人:ID =@ + ID / TextView的
            机器人:layout_width =WRAP_CONTENT
            机器人:layout_height =WRAP_CONTENT
            机器人:ellipsize =开始
            机器人:单线=真
            机器人:文字颜色=#FFFFFF/>

    < / RelativeLayout的>

< / RelativeLayout的>
 

I trying to make a gallery. I know how to get all photos and to show them in grid view. But can someone explain how to get and show folders(with photos)?

i've got error after launching my apk file. look plz at my xml files, may be something wrong here??? gridview.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
    <GridView
        android:id="@+id/gridView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        android:layout_marginBottom="-10dp"
        android:layout_marginLeft="-10dp"
        android:layout_marginRight="-10dp"
        android:layout_marginTop="-10dp"
        android:horizontalSpacing="-15dp"
        android:numColumns="3"
        android:padding="0dp"
        android:verticalSpacing="-15dp" >
    </GridView>
    </LinearLayout>

and grid_item:

<ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:layout_marginRight="2dp"
        android:layout_marginTop="2dp"

        android:gravity="center"
        android:scaleType="center"
         />

解决方案

EDIT : I've thrown together a working example for you. It works like this:

It will start within a directory (in the example below, /storage/sdcard/DCIM/). If the directory contains any images, they will be displayed. If it contains any sub-directories, it will check to see if they contain either images, or their own sub-directories. If they do, a folder icon will be displayed. Clicking on the folder icon will open up the folder, and show the images/ sub-directories that it contains.

Please note that this is just intended to give you a rough idea of how to implement it-- you will still need to work on this code a bit to improve the efficiency, especially in terms of memory usage, but I've run this on my emulator and the code is working.

Within your activity

public class MainActivity extends Activity implements OnItemClickListener {

    List<GridViewItem> gridItems;


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

        setGridAdapter("/storage/sdcard/DCIM/");
    }


    /**
     * This will create our GridViewItems and set the adapter
     * 
     * @param path
     *            The directory in which to search for images
     */
    private void setGridAdapter(String path) {
        // Create a new grid adapter
        gridItems = createGridItems(path);
        MyGridAdapter adapter = new MyGridAdapter(this, gridItems);

        // Set the grid adapter
        GridView gridView = (GridView) findViewById(R.id.gridView);
        gridView.setAdapter(adapter);

        // Set the onClickListener
        gridView.setOnItemClickListener(this);
    }


    /**
     * Go through the specified directory, and create items to display in our
     * GridView
     */
    private List<GridViewItem> createGridItems(String directoryPath) {
        List<GridViewItem> items = new ArrayList<GridViewItem>();

        // List all the items within the folder.
        File[] files = new File(directoryPath).listFiles(new ImageFileFilter());
        for (File file : files) {

            // Add the directories containing images or sub-directories
            if (file.isDirectory()
                && file.listFiles(new ImageFileFilter()).length > 0) {

                items.add(new GridViewItem(file.getAbsolutePath(), true, null));
            }
            // Add the images
            else {
                Bitmap image = BitmapHelper.decodeBitmapFromFile(file.getAbsolutePath(),
                                                                 50,
                                                                 50);
                items.add(new GridViewItem(file.getAbsolutePath(), false, image));
            }
        }

        return items;
    }


    /**
     * Checks the file to see if it has a compatible extension.
     */
    private boolean isImageFile(String filePath) {
        if (filePath.endsWith(".jpg") || filePath.endsWith(".png"))
        // Add other formats as desired
        {
            return true;
        }
        return false;
    }


    @Override
    public void
            onItemClick(AdapterView<?> parent, View view, int position, long id) {

        if (gridItems.get(position).isDirectory()) {
            setGridAdapter(gridItems.get(position).getPath());
        }
        else {
            // Display the image
        }

    }

    /**
     * This can be used to filter files.
     */
    private class ImageFileFilter implements FileFilter {

        @Override
        public boolean accept(File file) {
            if (file.isDirectory()) {
                return true;
            }
            else if (isImageFile(file.getAbsolutePath())) {
                return true;
            }
            return false;
        }
    }

}

Then you need to create the adapter, which should extend BaseAdapter, and look like this.

public class MyGridAdapter extends BaseAdapter {

    LayoutInflater inflater;
    List<GridViewItem> items;


    public MyGridAdapter(Context context, List<GridViewItem> items) {
        this.items = items;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }


    @Override
    public int getCount() {
        return items.size();
    }


    @Override
    public Object getItem(int position) {
        return items.get(position);
    }


    @Override
    public long getItemId(int position) {
        return position;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.grid_item, null);
        }

        TextView text = (TextView) convertView.findViewById(R.id.textView);
        text.setText(items.get(position).getPath());

        ImageView imageView = (ImageView) convertView.findViewById(R.id.imageView);
        Bitmap image = items.get(position).getImage();

        if (image != null){
            imageView.setImageBitmap(image);
        }
        else {
            // If no image is provided, display a folder icon.
            imageView.setImageResource(R.drawable.your_folder_icon);
        }

        return convertView;
    }

}

And you need to create a class that represents each grid item

public class GridViewItem {

    private String path;
    private boolean isDirectory;
    private Bitmap image;


    public GridViewItem(String path, boolean isDirectory, Bitmap image) {
        this.path = path;
        this.isDirectory = isDirectory;
        this.image = image;
    }


    public String getPath() {
        return path;
    }


    public boolean isDirectory() {
        return isDirectory;
    }


    public Bitmap getImage() {
        return image;
    }
}

A class for working with images

public abstract class BitmapHelper {

    public static Bitmap decodeBitmapFromFile(String imagePath,
                                              int reqWidth,
                                              int reqHeight) {

        // First decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(imagePath, options);

        // Calculate inSampleSize
        options.inSampleSize = calculateSampleSize(options, reqWidth, reqHeight);

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeFile(imagePath, options);
    }


    private static int calculateSampleSize(BitmapFactory.Options options,
                                           int reqHeight,
                                           int reqWidth) {

        // Raw height and width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {

            final int halfHeight = height / 2;
            final int halfWidth = width / 2;

            // Calculate the largest inSampleSize value that is a power of 2 and
            // keeps both
            // height and width larger than the requested height and width.
            while ((halfHeight / inSampleSize) > reqHeight
                   && (halfWidth / inSampleSize) > reqWidth) {
                inSampleSize *= 2;
            }
        }

        return inSampleSize;

    }

}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/gridView"
    android:numColumns="auto_fit"
    android:gravity="center"
    android:columnWidth="150dp"
    android:stretchMode="columnWidth"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
</GridView>

grid_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="150dp"
    android:layout_height="150dp"
    android:padding="5dp" >

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:scaleType="centerCrop"
        android:src="@drawable/andrew_salgado" >
    </ImageView>

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="20dp"
        android:layout_alignParentBottom="true"
        android:alpha="0.8"
        android:background="#000000" >

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ellipsize="start"
            android:singleLine="true"
            android:textColor="#FFFFFF" />

    </RelativeLayout>

</RelativeLayout>

 
精彩推荐
图片推荐