您的位置:首页 > 移动开发 > Android开发

android学习笔记(一) 遍历SD卡中所有文件并在listview中显示

2011-06-07 14:21 393 查看
有关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<? extends Map<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<? extends Map<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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: