加载中…
个人资料
新月
新月
  • 博客等级:
  • 博客积分:0
  • 博客访问:138,500
  • 关注人气:23
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

在ListView上显示数据

(2013-02-23 17:44:31)
标签:

it

有关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"。

 

 

[java] view plaincopy
  1. private void getAllFiles(File root){  
  2.           
  3.         File files[] root.listFiles();  
  4.           
  5.         if(files != null 
  6.         for(File f:files){  
  7.           
  8.             if(f.isDirectory()){  
  9.                 getAllFiles(f);  
  10.              
  11.             else 
  12.                 this.list.add(f);  
  13.              
  14.          
  15.      

 

 

调用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?>>类型

 

以下为转化函数

 

[java] view plaincopy
  1. private ArrayList<Map<String, Object>> getMapData(ArrayList<File> list){  
  2.         ArrayList<Map<String, Object>> data new ArrayList<Map<String, Object>>();  
  3.         HashMap<String,Object> item;  
  4.         int 0  
  5.         for(i=0;i<list.size();i++){  
  6.                 item new HashMap<String,Object>();  
  7.                 String path  list.get(i).toString();  
  8.                 String name path.substring(path.lastIndexOf("/")+1,path.length());  
  9.                 //保存每一格list单元格的数据   
  10.                 item.put("ItemText",name);  
  11.                 item.put("ItemTitle"path);  
  12.                  
  13.                 data.add(item);  
  14.          
  15.         return data;  
  16.      

 

 

最后 通过listView 显示 方法为

 

[java] view plaincopy
  1. (ListView) findViewById(R.id.music_list);  
  2.         list new ArrayList<File>();   
  3.           
  4.         getAllFiles(new File("/sdcard"));  
  5.         SimpleAdapter ladapter new SimpleAdapter(this,getMapData(list),R.layout.relative, new String[]{"ItemText","ItemTitle"},new int[]{R.id.ItemTitle,R.id.ItemText});  
  6.         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

 

[java] view plaincopy
  1. package my.sd;  
  2. import java.io.File;  
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.Iterator;  
  6. import java.util.Map;  
  7. import android.app.Activity;  
  8. import android.os.Bundle;  
  9. import android.widget.Button;  
  10. import android.widget.ListView;  
  11. import android.widget.SimpleAdapter;  
  12. import android.widget.TextView;  
  13. public class testSD extends Activity  
  14.       
  15.     //view   
  16.     TextView tView  
  17.     ListView  
  18.     Button btn   
  19.       
  20.       
  21.     //data   
  22.     private ArrayList<File> list  
  23.       
  24.     @Override  
  25.     public void onCreate(Bundle savedInstanceState)  
  26.         super.onCreate(savedInstanceState);  
  27.         setContentView(R.layout.main);  
  28.           
  29.         tView (TextView)findViewById(R.id.textview1);   
  30.           
  31.         //btn (Button) findViewById(R.id.go);  
  32.         tView new TextView(this);  
  33.         tView.setText("get all files in your sd card");  
  34.           
  35.         //init data  
  36.         (ListView) findViewById(R.id.music_list);  
  37.         list new ArrayList<File>();   
  38.           
  39.         getAllFiles(new File("/sdcard"));  
  40.         SimpleAdapter ladapter new SimpleAdapter(this,getMapData(list),R.layout.relative, new String[]{"ItemText","ItemTitle"},new int[]{R.id.ItemTitle,R.id.ItemText});  
  41.         i.setAdapter(ladapter);  
  42.          
  43.         TextView empty new TextView(this);  
  44.         empty.setText("empty!");  
  45.         i.setEmptyView(empty);  
  46.   
  47.      
  48.      
  49.    
  50.     private ArrayList<Map<String, Object>> getMapData(ArrayList<File> list){  
  51.         ArrayList<Map<String, Object>> data new ArrayList<Map<String, Object>>();  
  52.         HashMap<String,Object> item;  
  53.         int 0  
  54.         for(i=0;i<list.size();i++){  
  55.                 item new HashMap<String,Object>();  
  56.                 String path  list.get(i).toString();  
  57.                 String name path.substring(path.lastIndexOf("/")+1,path.length());  
  58.                 //保存每一格list单元格的数据   
  59.                 item.put("ItemText",name);  
  60.                 item.put("ItemTitle"path);  
  61.                  
  62.                 data.add(item);  
  63.          
  64.         return data;  
  65.      
  66.     private void getAllFiles(File root){  
  67.           
  68.         File files[] root.listFiles();  
  69.           
  70.         if(files != null 
  71.         for(File f:files){  
  72.           
  73.             if(f.isDirectory()){  
  74.                 getAllFiles(f);  
  75.              
  76.             else 
  77.                 this.list.add(f);  
  78.              
  79.          
  80.      
  81.  

 

res/layout/main.xml

 

[xhtml] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7. <TextView  android:id="@+id/textview1"   
  8.     android:layout_width="fill_parent"   
  9.     android:layout_height="wrap_content"   
  10.     android:text="@string/hello"  
  11.     />  
  12.       
  13.   
  14. <ListView  android:id="@+id/music_list"   
  15. android:layout_width="fill_parent"   
  16. android:layout_height="wrap_content"   
  17. />  
  18.   
  19. </LinearLayout>  

 

 

res/layout/relative.xml

 

[xhtml] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout   
  3.     android:id="@+id/RelativeLayout01"   
  4.     android:layout_width="fill_parent"   
  5.     xmlns:android="http://schemas.android.com/apk/res/android"   
  6.     android:layout_height="wrap_content"   
  7.     android:paddingBottom="3dip"   
  8.     android:paddingLeft="10dip"  
  9.     android:paddingRight="10dip">  
  10. <TextView   
  11.     android:id="@+id/ItemTitle"  
  12.     android:text="TextView01"   
  13.     android:layout_height="wrap_content"   
  14.     android:textSize="18dip"   
  15.     android:layout_width="fill_parent"   
  16.         />  
  17. <TextView   
  18.         android:id="@+id/ItemText"  
  19.     android:text="TextView02"   
  20.     android:layout_height="wrap_content"   
  21.     android:layout_width="fill_parent"   
  22.     android:layout_below="@+id/ItemTitle"   
  23.         />  
  24. </RelativeLayout>  

 

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
前一篇:去屎
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

    < 前一篇去屎
      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有