zoukankan      html  css  js  c++  java
  • Android_(控件)使用ListView显示Android系统中SD卡的文件列表

     使用ListView显示Android SD卡中的文件列表

    父类布局activity_main.xml,子类布局line.xml(一个文件的单独存放)

    运行截图:

     

    程序结构:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.asus.gary03_text">
    
        
        <!--AndroidManifest.xml获取手机存储卡权限-->
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
        
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    AndroidManifest.xml
    package com.example.asus.gary03_text;
    
    
    import android.support.v7.app.AppCompatActivity;
    import java.io.File;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.Button;
    import android.widget.ListView;
    import android.widget.SimpleAdapter;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
    
        ListView listView;
        TextView textView;
        //记录当前的父文件夹
        File currentParent;
        //记录当前目录路径下的所有文件的文件数组
        File[] currentFiles;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //获取列出全部文件的ListView
            listView = (ListView)findViewById(R.id.list);
            textView = (TextView)findViewById(R.id.path);
            //获取系统的SD卡的目录
            File root = new File("/mnt/sdcard/");
            //如果SD卡存在
            if(root.exists()){
                currentParent = root;
                currentFiles = root.listFiles();
                //使用当前目录下的全部文件、文件夹来填充ListView
                inflateListView(currentFiles);
            }
            //为ListView的列表项的单击事件绑定监听器
            listView.setOnItemClickListener(new OnItemClickListener() {
    
                public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                                        long arg3) {
                    // TODO Auto-generated method stub
                    //用户单击了文件,直接返回,不做任何处理
                    if(currentFiles[arg2].isFile())
                        return;
                    //获取用户单击的文件夹下的所有文件
                    File[] tmp = currentFiles[arg2].listFiles();
                    if(tmp == null || tmp.length == 0){
                        Toast.makeText(MainActivity.this, "当前路径不可访问或该路径下没有文件",Toast.LENGTH_SHORT).show();
                    }
                    else{
                        //获取用户单击的列表项对应的文件夹,设为当前的父文件夹
                        currentParent = currentFiles[arg2];
                        //保存当前的父文件夹内的全部文件和文件夹
                        currentFiles = tmp;
                        //再次更新ListView
                        inflateListView(currentFiles);
                    }
                }
            });
            //获取上一级目录的按钮
            Button parent = (Button)findViewById(R.id.parent);
            parent.setOnClickListener(new OnClickListener() {
    
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    try{
                        if(!currentParent.getCanonicalPath().equals("/mnt/sdcard")){
                            //获取上级目录
                            currentParent = currentParent.getParentFile();
                            //列出当前目录下所有文件
                            currentFiles = currentParent.listFiles();
                            //再次更新ListView
                            inflateListView(currentFiles);
                        }
                    }catch (Exception e) {
                        // TODO: handle exception
                        e.printStackTrace();
                    }
                }
            });
        }
        private void inflateListView(File[] files){
            //创建一个List集合,List集合的元素是Map
            List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
            for(int i = 0; i < files.length; i++){
                Map<String, Object> listItem = new HashMap<String, Object>();
                //如果当前File是文件夹,使用floder图标;否则使用file图标
                if(files[i].isDirectory()){
                    listItem.put("icon", R.drawable.folder);
                }
                else{
                    listItem.put("icon", R.drawable.file);
                }
                listItem.put("fileName", files[i].getName());
                //添加List项
                listItems.add(listItem);
            }
            //创建一个SimpleAdapter
            SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems, R.layout.line,
                    new String[]{"icon","fileName"}, new int[]{R.id.icon, R.id.file_name});
            //为ListView设置Adapter
            listView.setAdapter(simpleAdapter);
            try{
                textView.setText("当前路径为: " + currentParent.getCanonicalPath());
            }catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
        }
    }
    MainActivity
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
        <!-- 显示当前路径的的文本框 -->
        <TextView
            android:id="@+id/path"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            />
        <!-- 列出当前路径下所有文件的ListView -->
        <ListView
            android:id="@+id/list"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:divider="#000"
            />
        <!-- 返回上一级目录的按钮 -->
        <Button android:id="@+id/parent"
            android:layout_width="180dp"
            android:layout_height="80dp"
            android:text="返回"
            android:paddingTop="20dp"
            android:layout_gravity="center"/>
    </LinearLayout>
    activity_main
    <?xml version="1.0" encoding="UTF-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
        <!-- 定义一个ImageView,用于作为列表项的一部分。 -->
        <ImageView android:id="@+id/icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingLeft="10dp"
            />
        <!-- 定义一个TextView,用于作为列表项的一部分。 -->
        <TextView android:id="@+id/file_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16dp"
            android:gravity="center_vertical"
            android:paddingLeft="10dp"
            android:paddingTop="10dp"
            android:paddingBottom="10dp"
            />
    </LinearLayout>
    line

     一、获取手机存储卡权限

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

    二、界面布局

    activity_main.xml布局中

      TextView中显示当前路径的的文本框,ListView列出当前路径下所有文件的ListView ,Button按钮返回上一级目录

    link.xml布局中

      ImageView和extView,用于作为列表项的一部分

    三、实现程序功能

    1、ListView列表的事件监听器

          listView.setOnItemClickListener(new OnItemClickListener() {
    
                public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                                        long arg3) {
                    // TODO Auto-generated method stub
                    //用户单击了文件,直接返回,不做任何处理
                    if(currentFiles[arg2].isFile())
                        return;
                    //获取用户单击的文件夹下的所有文件
                    File[] tmp = currentFiles[arg2].listFiles();
                    if(tmp == null || tmp.length == 0){
                        Toast.makeText(MainActivity.this, "当前路径不可访问或该路径下没有文件",Toast.LENGTH_SHORT).show();
                    }
                    else{
                        //获取用户单击的列表项对应的文件夹,设为当前的父文件夹
                        currentParent = currentFiles[arg2];
                        //保存当前的父文件夹内的全部文件和文件夹
                        currentFiles = tmp;
                        //再次更新ListView
                        inflateListView(currentFiles);
                    }
                }
            });

    2、返回按键按钮

      Button parent = (Button)findViewById(R.id.parent);
            parent.setOnClickListener(new OnClickListener() {
    
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    try{
                        if(!currentParent.getCanonicalPath().equals("/mnt/sdcard")){
                            //获取上级目录
                            currentParent = currentParent.getParentFile();
                            //列出当前目录下所有文件
                            currentFiles = currentParent.listFiles();
                            //再次更新ListView
                            inflateListView(currentFiles);
                        }
                    }catch (Exception e) {
                        // TODO: handle exception
                        e.printStackTrace();
                    }
                }
            });
        }

    3、用List集合存放文件,并且创建一个适配器SimpleAdapter

    构造方法:SimpleAdapter(Contextcontext,List>data,intresource,String[]from,int[]to)

    context:要使用的上下文环境。

    data:是一个List>类型的集合对象,该集合中每个Map对象生成一个列表项。

    resource:界面布局文件的ID,对应的布局文件作为列表项的组件。

    from:是一个String[]类型的参数,该参数决定提取Map对象中哪些key对应的value来生成列表项。

    to:该参数是一个int[]类型的参数,该参数决定填充哪些组件。



    private void inflateListView(File[] files){
            //创建一个List集合,List集合的元素是Map
            List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
            for(int i = 0; i < files.length; i++){
                Map<String, Object> listItem = new HashMap<String, Object>();
                //如果当前File是文件夹,使用floder图标;否则使用file图标
                if(files[i].isDirectory()){
                    listItem.put("icon", R.drawable.folder);
                }
                else{
                    listItem.put("icon", R.drawable.file);
                }
                listItem.put("fileName", files[i].getName());
                //添加List项
                listItems.add(listItem);
            }
            //创建一个SimpleAdapter
            SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems, R.layout.line,
                    new String[]{"icon","fileName"}, new int[]{R.id.icon, R.id.file_name});
            //为ListView设置Adapter
            listView.setAdapter(simpleAdapter);
            try{
                textView.setText("当前路径为: " + currentParent.getCanonicalPath());
            }catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
        }
    (如需转载学习,请标明出处)
  • 相关阅读:
    UltraEdit 注册机使用说明
    sybase 收集常用sql语句
    过渡模式
    JavaScript 钩子
    自定义过渡的类名
    CSS过渡、CSS动画
    单元素/组件的过渡
    通过 v-once 创建低开销的静态组件
    内联模板、X-Template
    程序化的时间侦听器
  • 原文地址:https://www.cnblogs.com/1138720556Gary/p/9056752.html
Copyright © 2011-2022 走看看