android学习笔记(一) 遍历SD卡中所有文件并在listview中显示
有关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>
更多相关文章
- 一句话锁定MySQL数据占用元凶
- 如何将当前布局用代码保存在png图像文件中?
- Android通过putExtra()传递JavaBean对象,属性值为null问题的解决
- Android(安卓)如何使用使用数据库
- Android(安卓)地址选择器仿京东;
- Android(安卓)listview适配器
- 在Android上使用微信开源数据库框架WCDB
- 【Android】保存Fragment切换状态
- 【Android(安卓)基础】 序列化 Parcelable 使用