Android BaseAdapter ListView (SD卡中文件目录显示出来)
首先搭建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卡中文件目录显示出来)的更多相关文章
- 将文件放到Android模拟器的SD卡中的两种解决方法
两种方式:一.窗口界面操作1.打开DDMS页面2.打开File Explorer页,如果没有,在Window --> Show View -->File Explorer3.一般就在mnt ...
- 【Android 界面效果30】Android中ImageSwitcher结合Gallery展示SD卡中的资源图片
本文主要是写关于ImageSwitcher结合Gallery组件如何展示SDCard中的资源图片,相信大家都看过API Demo 中也有关于这个例子的,但API Demo 中的例子是展示工程中Draw ...
- Android中使用SQLiteOpenHelper管理SD卡中的数据库
使用Android中自带的SQLiteOpenHelper可以完成数据库的创建与管理,但有两点局限: (1)数据库创建在内存卡中,大小受限,创建位置位于/data/data/应用程序名/databas ...
- android 读取sd卡中的图片
一.获取读取SD卡的权限 <!--在SDCard中创建与删除文件权限 --> <uses-permission android:name="android.perm ...
- 转-Android 之 使用File类在SD卡中读取数据文件
如果需要在程序中使用sdcard进行数据的存储,那么需要在AndroidMainfset.xml文件中 进行权限的配置: Java代码: <!-- 在sd中创建和删除文件的权限 --> ...
- Android 将文件保存到SD卡中
①写文件到sd卡中需要获得权限,在AndroidManifest.xml中添加如下权限: <uses-permission android:name="android.permissi ...
- android保存文件到SD卡中
想把文件保存到SD卡中,一定要知道SD卡的路径,有人说可以用File explore来查看,这种方法不太好,因为随着android版本的升级,SD卡的路径可能会发生改变.在1.6的时候SD的路径是/s ...
- Android获取SD卡中选中图片的路径(URL)
最近在做一个图片上传的功能,需要提供上传图片在SD卡中的路径,在网上看了些例子,改改调试成功,代码很简单.其布局文件如下: [html] view plain copy <?xml ver ...
- Android 5.1.1在外置SD卡中创建文件夹
Android 4.4之后WRITE_MEDIA_STORAGE 权限仅提供给系统应用,不再授予第三方App,WRITE_EXTERNAL_STORAGE 权限,仅仅用于授权用户写 primary e ...
随机推荐
- (转)MySQL数据库命名规范及约定
一.[操作规范]1. 如无备注,则表中的第一个id字段一定是主键且为自动增长:2. 如无备注,则数值类型的字段请使用UNSIGNED属性:3. 如无备注,排序字段order_id在程序中默认使用降序排 ...
- Oracle11G安装
1.安装Oracle 记住要设置好密码 不要忘了 解锁scott(注意一定要解锁)账户, 去掉前面的绿色小勾,输入密码.同样可以输入平常用的短小的密码,不必非得按oracle建议的8位以上大小写加数字 ...
- cocopods安装
CocoaPods安装和使用教程 Code4App 原创文章.转载请注明出处:http://code4app.com/article/cocoapods-install-usage 目录 CocoaP ...
- Hibernate 一对多双向关联Demo
以Classes[班级]和Student[学生]为例的Demo //Classes.java public class Classes implements Serializable { privat ...
- TCP/IP-IP
A contented mind is a perpetual feast. "知足长乐" 参考资料:TCP/IP入门经典 (第五版) TCP/IP详解 卷一:协议 一.简介 IP ...
- Java学习----Java程序结构
1.什么是类 在源文件中程序员自己定义的通过class关键字,自己给类名这样的定义的一个类,而类里包含一个或多个方法 2.什么是源文件 由程序员使用java语言编写的以.java为结尾的一个文件 3. ...
- nodejs读取本地txt文件并输出到浏览器
var fs = require('fs'); var chrome=""; //同步执行 function tongbu(){ var data =fs.readFileSync ...
- html页面button样式
在过去的Web开发中,通常使用Photoshop来设计按钮的样式.不过随着CSS3技术的发展,你完全可以通过几行代码来定制一个漂亮的按钮,并且还可以呈现渐变.框阴影.文字阴影等效果.此类按钮最大的优势 ...
- Extjs中Chart利用series的tips属性设置鼠标划过时显示数据
效果如下: 从官网找到的例子,大家参考下吧.源码: Ext.require('Ext.chart.*'); Ext.require('Ext.layout.container.Fit'); Ext.o ...
- [oracle]删除一张表中重复数据,保留其id字段最小的sql
1.表数据结构如下 select * from test t , 'jerry'); , 'jerry'); , 'jerry'); , 'tom'); , 'tom'); , 'jake'); , ...