首先搭建activity_main.xml布局

搭建ListView中显示的布局

创建适配器

  将File数据和UI适配

MainActivity中将ListView设置适配器,并设置监听

//获取SD卡根目录,必须获取权限,权限在AndroidManifest.xml/Permissions中添加

1、首先搭建activity_main.xml布局

  文件目录置顶,给一个不同的颜色

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <LinearLayout
android:id="@+id/ll_root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <TextView
android:id="@+id/root"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/holo_green_light"
android:text="手机目录>" />
</LinearLayout> <ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent" /> </LinearLayout>

2、搭建ListView中显示的布局

  左边显示图片,右边也是一个LinearLayout布局,上面显示文件名称,下面显示最后修改时间

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:orientation="horizontal" > <ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/folder" /> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:orientation="vertical" > <TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="文件名" /> <TextView
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="时间" />
</LinearLayout> </LinearLayout>

3、创建适配器

 public class MyAdapter extends BaseAdapter {
Context context;
List<File> list; public MyAdapter(Context context, List<File> list) {
this.context = context;
this.list = list;
} @Override
public int getCount() {
return list.size();
} @Override
public Object getItem(int position) {
return list.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
//布局实例化
convertView = View.inflate(context, R.layout.item_filelayout, null);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
// 设置数据
File file = (File) getItem(position);
if (file.isDirectory()) {
viewHolder.img.setImageResource(R.drawable.folder);
} else {
if (file.getName().endsWith(".jpg")
|| file.getName().endsWith(".png")
|| file.getName().endsWith(".gif")) {
viewHolder.img.setImageResource(R.drawable.pic);
} else if (file.getName().endsWith(".txt") || file.getName().endsWith(".log")) {
viewHolder.img.setImageResource(R.drawable.text);
} else {
viewHolder.img.setImageResource(R.drawable.unknown);
}
}
viewHolder.name.setText(file.getName());
viewHolder.time.setText(new SimpleDateFormat("yy-M-d HH:mm:ss")
.format(new Date(file.lastModified()))); return convertView;
} class ViewHolder {
ImageView img;
TextView name;
TextView time; public ViewHolder(View convertView) {
img = (ImageView) convertView.findViewById(R.id.img);
name = (TextView) convertView.findViewById(R.id.name);
time = (TextView) convertView.findViewById(R.id.time);
} } }

4、MainAcitivity中给ListView设置适配器

//获取SD卡根目录,必须获取权限,权限在AndroidManifest.xml/Permissions中添加
 public class MainActivity extends Activity implements OnItemClickListener, OnClickListener {

     LinearLayout ll_root;
TextView root;
ListView lv;
List<File> list = new ArrayList<File>(); //获取SD卡根目录,必须获取权限,权限在AndroidManifest.xml/Permissions中添加
public static final String SDCard = Environment
.getExternalStorageDirectory().getAbsolutePath(); // 当前文件目录
public static String currDir = SDCard;
MyAdapter adapter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
adapter = new MyAdapter(MainActivity.this, list);
lv.setAdapter(adapter);
getAllFiles(); } private void initData() {
ll_root = (LinearLayout) findViewById(R.id.ll_root);
root = (TextView) findViewById(R.id.root);
lv = (ListView) findViewById(R.id.lv);
lv.setOnItemClickListener(this);
root.setOnClickListener(this);
} public void getAllFiles() {
list.clear();
File file = new File(currDir);
if (file.isDirectory()) {
File[] files = file.listFiles();
if (files != null) {
for (File file2 : files) {
list.add(file2);
}
}
}
// 文件排序
sort(); // 数据改变之后刷新
// notifyDataSetChanged方法通过一个外部的方法控制如果适配器的内容改变时需要强制调用getView来刷新每个Item的内容,
// 可以实现动态的刷新列表的功能
adapter.notifyDataSetChanged();
} private void sort() {
//使用Collection.sort排序,给定一个比较器,使用匿名内部类实现比较器接口
Collections.sort(list, new Comparator<File>() { @Override
public int compare(File o1, File o2) {
if (o1.isDirectory() && o2.isDirectory() || o1.isFile()
&& o2.isFile()) {
return o1.compareTo(o2);
}
//文件夹在前
return o1.isDirectory() ? -1 : 1;
}
});
} //ListView 监听
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
File file = list.get(position);
if (file.isDirectory()) {
// 下一层目录
currDir = file.getAbsolutePath();
//根目录名加上当前文件夹名
addDirText(file);
getAllFiles();
} else {
Toast.makeText(MainActivity.this, "打开" + file.getName(),
Toast.LENGTH_SHORT).show();
}
} private void addDirText(File file) {
String name = file.getName();
TextView tv = new TextView(this);
tv.setText(name+">");
ll_root.addView(tv);
//将当前的路径保存
tv.setTag(file.getAbsolutePath()); tv.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
String tag = v.getTag().toString();
currDir = tag;
getAllFiles(); //将后面的所有TextView的tag移除
//从后往前删,一个一个删
for (int i = ll_root.getChildCount(); i >1; i--) {
View view = ll_root.getChildAt(i-1);
String currTag = view.getTag().toString();
if(!currTag.equals(currDir)){
ll_root.removeViewAt(i-1);
}else{
return;
}
}
}
});
} // Back键返回上一级
@Override
public void onBackPressed() {
// 如果当前目录就是系统根目录,直接调用父类
if (currDir.equals(SDCard)) {
super.onBackPressed();
} else {
// 返回上一层,显示上一层所有文件
currDir = new File(currDir).getParent();
getAllFiles(); //将当前TextView的tag移除
//总是将最后一个TextView移除
View view = ll_root.getChildAt(ll_root.getChildCount()-1);
ll_root.removeView(view); }
} //SD卡根目录TextView监听
@Override
public void onClick(View v) {
currDir = SDCard;
getAllFiles(); //移除ll_root布局中的其他所有组件
for (int i = ll_root.getChildCount(); i >1; i--) {
ll_root.removeViewAt(i-1);
} } }

运行效果如下图:

图1

图2

Android BaseAdapter ListView (SD卡中文件目录显示出来)的更多相关文章

  1. 将文件放到Android模拟器的SD卡中的两种解决方法

    两种方式:一.窗口界面操作1.打开DDMS页面2.打开File Explorer页,如果没有,在Window --> Show View -->File Explorer3.一般就在mnt ...

  2. 【Android 界面效果30】Android中ImageSwitcher结合Gallery展示SD卡中的资源图片

    本文主要是写关于ImageSwitcher结合Gallery组件如何展示SDCard中的资源图片,相信大家都看过API Demo 中也有关于这个例子的,但API Demo 中的例子是展示工程中Draw ...

  3. Android中使用SQLiteOpenHelper管理SD卡中的数据库

    使用Android中自带的SQLiteOpenHelper可以完成数据库的创建与管理,但有两点局限: (1)数据库创建在内存卡中,大小受限,创建位置位于/data/data/应用程序名/databas ...

  4. android 读取sd卡中的图片

    一.获取读取SD卡的权限 <!--在SDCard中创建与删除文件权限  -->    <uses-permission android:name="android.perm ...

  5. 转-Android 之 使用File类在SD卡中读取数据文件

    如果需要在程序中使用sdcard进行数据的存储,那么需要在AndroidMainfset.xml文件中 进行权限的配置: Java代码:   <!-- 在sd中创建和删除文件的权限 --> ...

  6. Android 将文件保存到SD卡中

    ①写文件到sd卡中需要获得权限,在AndroidManifest.xml中添加如下权限: <uses-permission android:name="android.permissi ...

  7. android保存文件到SD卡中

    想把文件保存到SD卡中,一定要知道SD卡的路径,有人说可以用File explore来查看,这种方法不太好,因为随着android版本的升级,SD卡的路径可能会发生改变.在1.6的时候SD的路径是/s ...

  8. Android获取SD卡中选中图片的路径(URL)

    最近在做一个图片上传的功能,需要提供上传图片在SD卡中的路径,在网上看了些例子,改改调试成功,代码很简单.其布局文件如下: [html]  view plain copy   <?xml ver ...

  9. Android 5.1.1在外置SD卡中创建文件夹

    Android 4.4之后WRITE_MEDIA_STORAGE 权限仅提供给系统应用,不再授予第三方App,WRITE_EXTERNAL_STORAGE 权限,仅仅用于授权用户写 primary e ...

随机推荐

  1. .NET读取Excel

    1.代码 string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Path + ";Ext ...

  2. linq的一些用法总结

    获取列表数据. IList<Model> list = dao.getmx(Model, pageInfo);//获取数据列表 1.将列表中id一样的数据进行group by分组,并返回序 ...

  3. 标量类型(scalar)

    (ISO C11 §6.2.5) Arithmetic types and pointer types are collectively called scalar types. Array and ...

  4. 01-android快速入门

    adb Android debug bridge 安卓调试桥 创建模拟器,屏幕尽量小些,启动速度运行速度快 Android项目的目录结构 Activity:应用被打开时显示的界面 src:项目代码 R ...

  5. 认识div(division)在排版中的作用

    在网页制作过程过中,可以把一些独立的逻辑部分划分出来,放在一个<div>标签中,这个<div>标签的作用就相当于一个容器. 语法: <div>…</div&g ...

  6. 10 款强大的JavaScript图表图形插件推荐

    转自:http://www.iteye.com/news/24535 网上有很多用于绘制图表图形的免费JavaScript插件和图表库,这类插件大量出现的原因,一是人们不再依赖于Flash,二是浏览器 ...

  7. 正则如何匹配div下的所有<li>标签?

    <?php header('Content-Type:text/html;charset=utf-8'); $str = '<div class="c1s"> & ...

  8. HTML 内嵌JS脚本、相关参考手册

    提供一个JS.HTML参考手册入口:http://www.w3school.com.cn/jsref/index.asp. JavaScript 最常用于图片操作.表单数据处理以及内容动态更新. &l ...

  9. 委托的lambda表达式

    委托可以用 Lambda 表达式的方法来表示,很多C#的代码都会大量使用 Lambda 表达式,正确理解它的用法还是很重要的. 基础规则: Lambda 运算符 “=>” 左边表示委托实例所需要 ...

  10. 通过ctypes获得python windows process的内存使用情况

    通过ctypes 类库中的win32方法GetProcessMemoryInfo()获得当前进程的内存使用情况.该函数可以在32或者64位,python2.6+及python3.x之上都能有用. &q ...