在android中通過listview顯示sd卡中的文件列表一共有兩種方法,一是:通過繼承listactivity顯示;二是:利用baseadapter顯示。baseadapter是一個公共基類適配器,用于對listview和spinner等 一些控件提供顯示數據。下面是利用baseadapter類來實現通過listview顯示sd卡的步驟:
1.main.xml界面設計,如下圖
復制代碼 代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<textview
android:id="@+id/txt_path"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<button
android:id="@+id/but_up"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="向上" />
<listview
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</listview>
</linearlayout>
main.xml
2.item.xml界面設計,如下圖
復制代碼 代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/relativelayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<textview
android:id="@+id/txt_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignparentright="true"
android:layout_alignparenttop="true"
android:text="textview" />
<imageview
android:id="@+id/image_ico"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignparentleft="true"
android:layout_below="@+id/txt_size"
android:layout_marginleft="18dp"
android:src="@drawable/folder" />
<textview
android:id="@+id/txt_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignbottom="@+id/image_ico"
android:layout_alignparentright="true"
android:text="textview" />
</relativelayout>
item.xml
效果圖main.xml
效果圖item.xml
3.file_adter類的實現
復制代碼 代碼如下:
package com.cqvie;
import java.io.file;
import java.util.linkedlist;
import java.util.list;
import android.app.activity;
import android.graphics.bitmap;
import android.graphics.bitmapfactory;
import android.view.view;
import android.view.viewgroup;
import android.widget.baseadapter;
import android.widget.imageview;
import android.widget.textview;
public class file_adter extends baseadapter {
public activity activity; //創建view時必須要提供context
public list<file> list=new linkedlist<file>(); //數據源(文件列表)
public string currpath;//當前路徑
private bitmap bmp_folder,bmp_file;
public int getcount() {
// todo auto-generated method stub
return list.size();
}
public object getitem(int arg0) {
// todo auto-generated method stub
return null;
}
public long getitemid(int position) {
// todo auto-generated method stub
return position;
}
public view getview(int position, view arg1, viewgroup arg2) {
// todo auto-generated method stub
view v=view.inflate(activity,r.layout.item,null);
textview txt_name=(textview) v.findviewbyid(r.id.txt_name);
textview txt_size=(textview) v.findviewbyid(r.id.txt_size);
imageview img=(imageview) v.findviewbyid(r.id.image_ico);
file f=list.get(position);
txt_name.settext(f.getname());
txt_size.settext(getfilessize(f));
if(f.isdirectory())
img.setimagebitmap(bmp_folder);
else
img.setimagebitmap(bmp_file);
return v;
}
public void scanfiles(string path)
{
list.clear();
file dir=new file(path);
file[] subfiles=dir.listfiles();
if(subfiles!=null)
for(file f:subfiles)
list.add(f);
this.notifydatasetchanged();
currpath=path;
}
public file_adter(activity activity)
{
this.activity=activity;
bmp_folder=bitmapfactory.decoderesource(activity.getresources(),r.drawable.folder);//文件夾,decoderesource圖片解碼,source資源,解碼為bitmap類型;
bmp_file=bitmapfactory.decoderesource(activity.getresources(),r.drawable.file);//文件
}
public static string getfilessize(file f)
{
int sub_index=0;
string show="";
if(f.isfile())
{
long length=f.length();
if(length>=1073741824)
{
sub_index=string.valueof((float)length/1073741824).indexof(".");
show=((float)length/1073741824+"000").substring(0,sub_index+3)+"gb";
}
else if(length>=1048576)
{
sub_index=(string.valueof((float)length/1048576)).indexof(".");
show=((float)length/1048576+"000").substring(0,sub_index+3)+"gb";
}
else if(length>=1024)
{
sub_index=(string.valueof((float)length/1024)).indexof(".");
show=((float)length/1024+"000").substring(0,sub_index+3)+"gb";
}
else if(length<1024)
show=string.valueof(length)+"b";
}
return show;
}
}
file_adter.java
4.file_listactivity的實現
復制代碼 代碼如下:
package com.cqvie;
import java.io.file;
import android.app.activity;
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.textview;
public class file_listactivity extends activity implements onitemclicklistener, onclicklistener {
/** called when the activity is first created. */
@override
public void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.main);
list_view=(listview) findviewbyid(r.id.list_view);
but_up=(button) findviewbyid(r.id.but_up);
txt_path=(textview) findviewbyid(r.id.txt_path);
file_adter adter=new file_adter(this);
list_view.setadapter(adter);
list_view.setonitemclicklistener(this);
adter.scanfiles("/");
but_up.setonclicklistener(this);
}
listview list_view;
textview txt_path;
button but_up;
public void onclick(view v) {
// todo auto-generated method stub
file_adter ad=(file_adter) list_view.getadapter();
if(ad.currpath.equals("/")) return;
file f=new file(ad.currpath);
txt_path.settext(f.getparent());
ad.scanfiles(f.getparent());
}
public void onitemclick(adapterview<?> parent, view v, int positiong, long id) {
// todo auto-generated method stub
file_adter da=(file_adter) list_view.getadapter();
file f=da.list.get(positiong);
if(f.isdirectory())
{
txt_path.settext(f.getpath());
da.scanfiles(f.getpath());
}
}
}
file_listactivity.java
效果圖展示
總結
在做這個file_adter的時候,需要注意的有三點,一是在新建文件列表類的時候要繼承baseadapter,并且一定不要勾選主方法。二是要在res\drawable-hdpi中添加用于顯示文件和文件夾的圖片。三是在item.xml的設計時需把change layout中new layout type的值設為linearlayout,這樣就方便我們隨意放置imageview和textview的位置,從而有利于軟件的美觀。第一次做這個顯示sd卡中的文件列表時就失敗了,后來就不愛去碰它,不愛去解決這個問題。導致這個問題一直沒有解決,后來是迫于考試沒法就去重新做,才發現其實沒有什么問題,一直做下來都很順暢。這使我明白了可怕的不是問題,而是沒有去解決問題的恒心和懶惰的心理。其實有的問題它其實只是很簡單的問題只要輕輕松松的就解決了,而不是什么重大的問題。在日常生活和學習中我們應該簡單的看待問題。