在android中通过listview显示sd卡中的文件列表一共有两种方法,一是:通过继承listactivity显示;二是:利用baseadapter显示。baseadapter是一个公共基类适配器,用于对listview和spinner等 一些控件提供显示数据。下面是利用baseadapter类来实现通过listview显示sd卡的步骤:

1.main.xml界面设计,如下图

复制代码 代码如下:

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

android:id="@+id/txt_path"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hello" />

android:id="@+id/but_up"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="向上" />

android:id="@+id/list_view"

android:layout_width="match_parent"

android:layout_height="wrap_content" >

main.xml

2.item.xml界面设计,如下图

复制代码 代码如下:

android:id="@+id/relativelayout1"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

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" />

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" />

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" />

item.xml

1545393950-0.gif 

效果图main.xml

1545396162-1.gif

效果图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 list=new linkedlist(); //数据源(文件列表)

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

1545391O6-2.gif

效果图展示

总结

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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐