Android通过LIstView显示文件列表的两种方法介绍

时间:2022-04-16 08:20:35

在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


Android通过LIstView显示文件列表的两种方法介绍 
效果图main.xml
Android通过LIstView显示文件列表的两种方法介绍
效果图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


Android通过LIstView显示文件列表的两种方法介绍
效果图展示 
总结
在做这个file_adter的时候,需要注意的有三点,一是在新建文件列表类的时候要继承baseadapter,并且一定不要勾选主方法。二是要在res\drawable-hdpi中添加用于显示文件和文件夹的图片。三是在item.xml的设计时需把change layout中new layout type的值设为linearlayout,这样就方便我们随意放置imageview和textview的位置,从而有利于软件的美观。第一次做这个显示sd卡中的文件列表时就失败了,后来就不爱去碰它,不爱去解决这个问题。导致这个问题一直没有解决,后来是迫于考试没法就去重新做,才发现其实没有什么问题,一直做下来都很顺畅。这使我明白了可怕的不是问题,而是没有去解决问题的恒心和懒惰的心理。其实有的问题它其实只是很简单的问题只要轻轻松松的就解决了,而不是什么重大的问题。在日常生活和学习中我们应该简单的看待问题。