专属空间三——文件管理器

  今天是进行开发的第三天了,今天实现的是相当于一个文件管理器的功能。

  首先先说一下今天学到的东西:今天对昨天学到的东西ListView进行了应用,Adapter再一次的深加工。

  以及有如何获取SD卡的内容方法和权限的写法(这个要注意,要不然功能无法实现)

  主要是通过获取SD卡的内容加载到Map中,然后再加上适配器呈现在listView,其中要注意父目录和子目录的逻辑顺序,程序其实也就是相当于使用了递归的写法。 然后在上面加上了当前目录的位置,绝对路径。接着是在页面下写了一个Imagebutton,根据父子目录的递归带哦用跳转界面,也就是文件夹(判断当前目录是否为SD卡的根目录,如果是直接退出ACTIVITY如果不是,就获取当前文件的父目录,然后重新加载ListView文件)

  

下面是FileExplorer.java和对应的xml文件

package com.example.personspace.FileExplorer;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

import com.example.personspace.MainActivity;
import com.example.personspace.R;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class FileExplorerActivity extends AppCompatActivity {
    TextView pathTv;
    ImageButton backBtn;
    ListView fileLv;
    File currentParent;
    File[] currenFiles;
    File root;

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

        pathTv=findViewById(R.id.id_filepath);
        backBtn=findViewById(R.id.id_btn_back);
        fileLv=findViewById(R.id.id_lv_file);
        //判断手机是否装载了SD卡
        boolean isLoadSDCard= Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
        if (isLoadSDCard){
            //获取SD卡的根目录
            root=Environment.getExternalStorageDirectory();
            currentParent =root;
            //获取当前文件夹下所有的文件;
            currenFiles=currentParent.listFiles();
            inflateListView(currenFiles);
        }else{
            Toast.makeText(this,"SD卡没有被装载",Toast.LENGTH_SHORT).show();

        }
//      设置监听事件
        setListener();
    }

    private void setListener() {
        fileLv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (currenFiles[position].isFile()){
                    Toast.makeText(FileExplorerActivity.this,"无法打开此文件,正在完善中",Toast.LENGTH_SHORT).show();

                    return;
                }
                File[] temp=currenFiles[position].listFiles();
                if (temp==null||temp.length==0){
                    Toast.makeText(FileExplorerActivity.this,"当前文件夹没有内容或者不能被访问",Toast.LENGTH_SHORT).show();

                }else{
                    //修改被点击这项的父目录
                    currentParent=currenFiles[position];
                    currenFiles=temp;
                    //数据源发生改变,重新设置适配器内容
                    inflateListView(currenFiles);
                }

            }
        });


        backBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //判断当前的目录是否为SD卡的根目录,如果是直接退出activity
                //如果不是根目录,就获取当前文件的父目录,然后重新加载listView文件
                if (currentParent.getAbsolutePath().equals(root.getAbsolutePath())){
                    Intent intent=new Intent(FileExplorerActivity.this, MainActivity.class);
                    startActivity(intent);
                }else{
                    currentParent=currentParent.getParentFile();
                    currenFiles=currentParent.listFiles();
                    inflateListView(currenFiles);
                }



            }
        });

    }

    private void inflateListView(File[] currenFiles) {

        List<Map<String,Object>> list=new ArrayList<>();
        for (int i=0;i<currenFiles.length;i++){
            Map<String,Object> map=new HashMap<>();
            map.put("filename",currenFiles[i].getName());
            if (currenFiles[i].isFile()){
                map.put("icon",R.mipmap.file);
            }else {
                map.put("icon",R.mipmap.folder);
            }
            list.add(map);

        }
        //创建适配器
        SimpleAdapter adapter=new SimpleAdapter(this,list,R.layout.item_file_explorer,new String[]{"filename","icon"},new int[]{R.id.item_tv,R.id.item_laicon});
        fileLv.setAdapter(adapter);
        pathTv.setText("当前路径:"+currentParent.getAbsolutePath());
    }





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

    <TextView
        android:id="@+id/id_filepath"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="文件路劲:/mnt/sdcard"
        />
    <ImageButton
        android:id="@+id/id_btn_back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/back1"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"/>
    <ListView
        android:id="@+id/id_lv_file"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/id_filepath"
        android:layout_above="@id/id_btn_back"
        android:divider="#000"
        android:dividerHeight="1dp"/>

</RelativeLayout>

接下来是一个item_file_explorer.xml布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="5dp">
    <ImageView
        android:id="@+id/item_laicon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/folder"/>
    <TextView
        android:id="@+id/item_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="35sp"
        android:layout_marginLeft="20dp"
        android:text="112222"/>


</LinearLayout>

今天的任务稍微简单点。

 

  

posted on 2020-07-18 20:31  沫戏回首  阅读(171)  评论(0编辑  收藏  举报

导航