有关android SD卡操作中,遍历是最简单且最基础常用的操作。

下面就来实现遍历sd卡中所有文件,并且用一个ListView显示出来。

首先,了解一下ListView的用法。

android document中的解释:

A view that shows items in a vertically scrolling list. The items come from the ListAdapter associated with this view.

也就是说 listview是将一个ListAdapter的内容用图像显示出来,

所以我们可以用一个SimpleAdapter来保存SD卡遍历的结果。

而我们知道linux文件系统是一颗单独的树(没有森林)。所以从根目录进行一次深搜就能访问所有节点。

而android SD卡的根目录为"/sdcard"。

private void getAllFiles(File root){ File files[] = root.listFiles(); if(files != null) for(File f:files){ if(f.isDirectory()){ getAllFiles(f); } else{ this.list.add(f); } } }

调用getAllFiles(new File("/sdcard"))后所有文件保存在list中。

下面就是在将数据保存到SimpleAdapter中了。

查阅android document 其构造函数为:

public SimpleAdapter

(Context context, List<?extendsMap<String,?>> data, int resource, String[] from, int[] to)

其中

context为 显示listView的activity,

data为 数据,

resource为 listview中每一格单元格的布局xml的位置(res/layout/relative.xml,自己创建)

from 为listview中每一个item中组件(如一个item中含有2个textview--textview1,textview2)所对应的数据源。

to 为 form的数据源对应的item中组件的名称(textview1,textview2)。

所以需要将刚才得到的list数据转化成 List<?extendsMap<String,?>>类型

以下为转化函数

private ArrayList<Map<String, Object>> getMapData(ArrayList<File> list){ ArrayList<Map<String, Object>> data = new ArrayList<Map<String, Object>>(); HashMap<String,Object> item; int i = 0 ; for(i=0;i<list.size();i++){ item = new HashMap<String,Object>(); String path = list.get(i).toString(); String name = path.substring(path.lastIndexOf("/")+1,path.length()); //保存每一格list单元格的数据 , item.put("ItemText",name); item.put("ItemTitle", path); data.add(item); } return data; }

最后 通过listView 显示 方法为

i = (ListView) findViewById(R.id.music_list); list = new ArrayList<File>(); getAllFiles(new File("/sdcard")); SimpleAdapter ladapter = new SimpleAdapter(this,getMapData(list),R.layout.relative, new String[]{"ItemText","ItemTitle"},new int[]{R.id.ItemTitle,R.id.ItemText}); i.setAdapter(ladapter);

listView的布局定义在main.xml中

listview中单元格的布局定义在relative.xml中

以下是运行效果(读取的sd卡为模拟器中的SD卡,在真机上运行,文件太多,会花费几秒钟时间读取,可以将上述递归遍历改进):

模拟SD卡 内容 请看我另一篇文章。

以下是所有代码(可运行):

AndroidMainfest.xml中一定要加上

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

//testSD.java

package my.sd; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import android.app.Activity; import android.os.Bundle; import android.widget.Button; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView; public class testSD extends Activity { //view TextView tView ; ListView i ; Button btn ; //data private ArrayList<File> list ; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tView = (TextView)findViewById(R.id.textview1); //btn = (Button) findViewById(R.id.go); tView = new TextView(this); tView.setText("get all files in your sd card"); //init data i = (ListView) findViewById(R.id.music_list); list = new ArrayList<File>(); getAllFiles(new File("/sdcard")); SimpleAdapter ladapter = new SimpleAdapter(this,getMapData(list),R.layout.relative, new String[]{"ItemText","ItemTitle"},new int[]{R.id.ItemTitle,R.id.ItemText}); i.setAdapter(ladapter); TextView empty = new TextView(this); empty.setText("empty!"); i.setEmptyView(empty); } private ArrayList<Map<String, Object>> getMapData(ArrayList<File> list){ ArrayList<Map<String, Object>> data = new ArrayList<Map<String, Object>>(); HashMap<String,Object> item; int i = 0 ; for(i=0;i<list.size();i++){ item = new HashMap<String,Object>(); String path = list.get(i).toString(); String name = path.substring(path.lastIndexOf("/")+1,path.length()); //保存每一格list单元格的数据 , item.put("ItemText",name); item.put("ItemTitle", path); data.add(item); } return data; } private void getAllFiles(File root){ File files[] = root.listFiles(); if(files != null) for(File f:files){ if(f.isDirectory()){ getAllFiles(f); } else{ this.list.add(f); } } } }

res/layout/main.xml

<?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/textview1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <ListView android:id="@+id/music_list" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>

res/layout/relative.xml

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout android:id="@+id/RelativeLayout01" android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="wrap_content" android:paddingBottom="3dip" android:paddingLeft="10dip" android:paddingRight="10dip"> <TextView android:id="@+id/ItemTitle" android:text="TextView01" android:layout_height="wrap_content" android:textSize="18dip" android:layout_width="fill_parent" /> <TextView android:id="@+id/ItemText" android:text="TextView02" android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_below="@+id/ItemTitle" /> </RelativeLayout>

更多相关文章

  1. 一句话锁定MySQL数据占用元凶
  2. 如何将当前布局用代码保存在png图像文件中?
  3. Android通过putExtra()传递JavaBean对象,属性值为null问题的解决
  4. Android(安卓)如何使用使用数据库
  5. Android(安卓)地址选择器仿京东;
  6. Android(安卓)listview适配器
  7. 在Android上使用微信开源数据库框架WCDB
  8. 【Android】保存Fragment切换状态
  9. 【Android(安卓)基础】 序列化 Parcelable 使用

随机推荐

  1. 破解服务器Android防破解
  2. Android中的lcd_density设置
  3. Android XML属性在文档中的位置
  4. Android中用Kotlin Coroutine(协程)和Ret
  5. Android事件分发机制练习---打造属于自己
  6. Android中使用Tcpdump抓取网络数据包
  7. EditText的输入限制设置
  8. 【引用】Android的CTS测试
  9. 设置EditText可点击但是不可编辑
  10. adb pm 指令介绍