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

在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卡中的文件列表时就失败了,后来就不爱去碰它,不爱去解决这个问题。导致这个问题一直没有解决,后来是迫于考试没法就去重新做,才发现其实没有什么问题,一直做下来都很顺畅。这使我明白了可怕的不是问题,而是没有去解决问题的恒心和懒惰的心理。其实有的问题它其实只是很简单的问题只要轻轻松松的就解决了,而不是什么重大的问题。在日常生活和学习中我们应该简单的看待问题。

时间: 2024-07-28 14:47:39

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

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

在Android中通过ListView显示SD卡中的文件列表一共有两种方法,一是:通过继承ListActivity显示;二是:利用BaseAdapter显示.BaseAdapter是一个公共基类适配器,用于对ListView和Spinner等 一些控件提供显示数据.下面是利用BaseAdapter类来实现通过LIstView显示SD卡的步骤: 1.main.xml界面设计,如下图 复制代码 代码如下: <?xml version="1.0" encoding="utf-

word2013快速插入数学公式的两种方法介绍

  我相信的原则,一切问题应该都是有效率的,只是我们没发现.比如word2013,一般都是常规插入,这样效率很低,每次都要去点击一下MathType或者是去点击插入,太浪费时间,下面带来终极解决办法,一次解决终身问题!达到点击即可编辑的效果.下面就为大家介绍word2013快速插入数学公式的两种方法,一起来看看吧! 工具/原料 WORD2013 数学公式编辑器MathType 方法1:常规蜗牛法 我们插入数学公式常用的都是插入--公式--找到公式,或者是插入--对象--对象(J)--MathTy

Android中Intent传递对象的两种方法(Serializable,Parcelable)

Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是Bundle.putParcelable(Key, Object);当然这些Object是有一定的条件的,前者是实现了Serializable接口,而后者是实现了Parcelable接口,为了让大家更容易理解我还是照常写了一个简单的Demo,大家就一步一步跟我来吧! 第一步:新建一个Android工程命名为ObjectTranDemo(类比较

js控制页面控件隐藏显示的两种方法介绍_javascript技巧

javascript控制页面控件隐藏显示的两种方法,方法的不同之处在于控件隐藏后是否还在页面上占位 方法一: 复制代码 代码如下: document.all["panelsms"].style.visibility="hidden"; document.all["panelsms"].style.visibility="visible"; 方法二: 复制代码 代码如下: document.all["panelsms&

Android实现轮播效果的两种方法

实现轮播效果有2种方法: (1)使用ViewPager+ImageView,通过Handler进行间隔发送消息,实现自动轮播效果 xml代码: <android.support.v4.view.ViewPager android:id="@+id/fragment_viewPager" android:layout_width="match_parent" android:layout_height="200dp" /> privat

Android中Intent传递对象的两种方法Serializable,Parcelable

Android中的传递有两个方法,一个是Serializable,另一个是Parcelable. Serializable是J2SE本身就支持的.而Parcelable是Android所特有的. 二者的使用场景和区别: 1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable. 2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC. 3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelab

Android中获取状态栏高度的两种方法分享

前言 最近在做一个关于FAB的功能的时候需要获取状态栏的高度,在网上查了很多种方法,下面是选出的比较合理的两个方法.主要参考stackoverflow的这篇问答:http://stackoverflow.com/questions/3407256/height-of-status-bar-in-android 方法一: private double getStatusBarHeight(Context context){ double statusBarHeight = Math.ceil(25

jsp引入页面,即包含文件的两种方法介绍

最近在练手做一个小Demo中,比较多的用到了jsp引入另一个jsp的例子,感觉很简单,但是不幸出现了错误500,于是查找了一些资料来了解一下关于jsp包含的方法,这里分享出来,个人总结,可能不够完善,欢迎批评指正. 我们都知道在jsp中include有两种形式,分别是 :<%@ include file="要引入的文件 "%> :<jsp:include page=" 要引入的文件" flush="true"/>  前者是

UIImage初始化的区别两种方法介绍(面试常见)_Android

UIImage可以通过以下两种方式进行初始化: //第一种初始化方式:[注意使用这种初始化的时候如果是png格式的可以不给后缀名,根据屏幕的的分辨率去匹配图片] UIImage *image = [UIImage imageNamed:@"v_red_heart_selected"]; //第二种初始化方式:[必须拼接图片的全名称,否则image的路径为空] NSString *filePath = [[NSBundle mainBundle] pathForResource:@&qu