- 浏览: 6298 次
文章分类
最新评论
最近SDCard和File操作较多,称周末做了个dome总结下,希望对大家有帮助
功能模仿安卓优化大师的文件管理器,有些功能还没有完善,希望有时间的朋友帮忙完善下 先看效果图
我单击sime目录下的dota
界面如上,上面的两个按钮都是动态生成的单击它们可以回到对应的目录
来看下实现思路吧
首先,要获得这样一个文件目录的列表就用使用ListView
先看 UI的布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:id="@+id/layout1" android:layout_width="fill_parent" android:layout_height="40dp" android:layout_alignParentLeft="true" android:layout_alignParentTop="true"> </LinearLayout> <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@id/layout1"> </ListView> </RelativeLayout>
上面的LinearLayout是区域是用来存放动态添加的Button的
下面是ListView每个Item的UI布局
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:id="@+id/imgview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_marginLeft="5dp"/> <TextView android:id="@+id/txview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/imgview" android:layout_marginLeft="5dp" /> <TextView android:id="@+id/txpath" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/txview" android:visibility="gone"/>" </RelativeLayout>
布局文件写好了,现在重点就是在于如何填充ListView了,这本次dome中为了弄清楚适配器的原理在朋友的协助下自定义了一个适配器代码如下
package com.sime.tools; import java.util.List; import java.util.Map; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import com.sime.filedome.R; public class SimeAdapter extends BaseAdapter { private List<Map<String,Object>> listDate; private Context context; class holder{ ImageView imgview; TextView txview; TextView txpath; } public SimeAdapter( List<Map<String,Object>> listDate,Context context) { this.listDate = listDate; this.context = context; } @Override public int getCount() { // TODO Auto-generated method stub return listDate.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return listDate.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { holder hl=null; if(convertView == null ){ convertView=LayoutInflater.from(context).inflate(R.layout.items, null); hl=new holder(); hl.imgview=(ImageView)convertView.findViewById(R.id.imgview); hl.txview=(TextView)convertView.findViewById(R.id.txview); hl.txpath=(TextView)convertView.findViewById(R.id.txpath); convertView.setTag(hl); }else{ hl =(holder)convertView.getTag(); } hl.imgview.setImageDrawable(context.getResources().getDrawable(R.drawable.folder)); hl.txview.setText(listDate.get(position).get("txview").toString()); hl.txpath.setText(listDate.get(position).get("txpath").toString()); return convertView; } }
重点在于getView的方法,相当于去给每个ListView的每一行填充数据(开始时候我很是不理解)
首先获取到items的布局,接着获取到每个我们要用到的控件,并填充它们(这里少了些判断就是,不管是文件夹还是图片,文本我都用的一个图标表示的,有需要的朋友可以写一些方法判断)最后别忘了return convertView 我是个初学者,这段代码有些地方也不是很理解比如说那个 setTag()和 getTag(),如果懂的朋友下面说说。
接着就是要去遍历SDCard了,首先为了方便我写个方法去获取SDCard的根目录
public static String getSDcardPath() { String state = Environment.getExternalStorageState();//获取SDCard的状态值是否可以用 if (Environment.MEDIA_MOUNTED.equals(state)) {//与静态变量对比 String rootpath = Environment.getExternalStorageDirectory()//获得SDCard根目录 .toString(); return rootpath; } else{ return null; } }
接着写获取目录的方法
public static List<Map<String ,Object>> getDateList(String rootpath,Context context) { List<Map<String ,Object>> list=new ArrayList<Map<String ,Object>>(); File file=new File(rootpath); File [] files=null; if(file!=null && file.exists() && file.isDirectory()) { files=file.listFiles(); if(files.length!=0&& files!=null) { files=getOrderlist(files); for(int i=0;i<files.length;i++) { Map<String ,Object> map=new HashMap<String, Object>(); map.put("txview", files[i].getName()); map.put("txpath", files[i].getAbsolutePath()); list.add(map); } } } return list; }
但文件不可以是无序的显示,所有又写了个排序的方法
public static File[] getOrderlist(File[] files) { File file=null; for(int i=0;i<files.length-1;i++) { for(int j=i+1;j<files.length;j++) { if(files[i].getName().compareTo(files[i].getName())>0) { file=files[i]; files[i]=files[j]; files[j]=file; } } } return files; }
数据得到了,接下来就是填充了,这里思考了一下,应为我的listView是要不断的刷新的所以就写了个方法好调用
private void refeshListView(String itempath) { if (itempath != null && !"".equals(itempath)) { listDate = SDcardtools.getDateList(itempath, FileSDCard.this); if (listDate.size() > 0 && listDate != null) { SimeAdapter adapter = new SimeAdapter(listDate, FileSDCard.this); listview.setAdapter(adapter); listview.setOnItemClickListener(ListViewItemListener); } else if(listDate.size()==0) { Toast.makeText(FileSDCard.this, "不能运行", Toast.LENGTH_SHORT).show(); } } }
这样一来SDCard根目录下的文件都能显示了
接下来就是写每个listView 的Item的单击事件,写之前,这里我思考了好久,我不但要更新listView还要动态的更新Button和绑定事件。用List来控制Button的变化,抱着试试的想法
Items的监听事件
public OnItemClickListener ListViewItemListener = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapter, View v, int pos, long id) { Map<String ,Object> map=(Map<String, Object>) adapter.getItemAtPosition(pos); String path=(String) map.get("txpath"); File file=new File(path); if(file.isDirectory()&&file.listFiles().length>0) FileParent.add(file); if(path!=null &&! "".equals(path) ) { refeshListView(path); ButtonRefesh(FileSDCard.this); } } };
Button刷新的监听事件
public void ButtonRefesh(final Context context) { // mnt/sdcard/sime View v=LayoutInflater.from(context).inflate(R.layout.activity_file, null); LinearLayout layout1=(LinearLayout)findViewById(R.id.layout1); layout1.removeAllViews(); for(int i=0;i<FileParent.size();i++) { final String parentpath=FileParent.get(i).getParent(); final String path=FileParent.get(i).getPath(); Button bt=new Button(context); String text= path.substring( path.lastIndexOf("/")+1); bt.setText(text); bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub refeshListView(parentpath); removeButton(path); ButtonRefesh(context); } }); layout1.addView(bt); } }
然后每次都要把不需要的按钮删除,需要一个删除的方法
private ListView listview; private String Filepath=null; private List<Map<String, Object>> listDate = null; private List<File> FileParent=new ArrayList<File>(); @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_file); listview = (ListView) findViewById(R.id.listView1); refeshListView(SDcardtools.getSDcardPath()); } /* * 当点击 每个子项的时候刷新布局 * */ private void refeshListView(String itempath) { if (itempath != null && !"".equals(itempath)) { listDate = SDcardtools.getDateList(itempath, FileSDCard.this); if (listDate.size() > 0 && listDate != null) { SimeAdapter adapter = new SimeAdapter(listDate, FileSDCard.this); listview.setAdapter(adapter); listview.setOnItemClickListener(ListViewItemListener); } else if(listDate.size()==0) { Toast.makeText(FileSDCard.this, "不能运行", Toast.LENGTH_SHORT).show(); } } } public OnItemClickListener ListViewItemListener = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapter, View v, int pos, long id) { Map<String ,Object> map=(Map<String, Object>) adapter.getItemAtPosition(pos); String path=(String) map.get("txpath"); File file=new File(path); if(file.isDirectory()&&file.listFiles().length>0) FileParent.add(file); if(path!=null &&! "".equals(path) ) { refeshListView(path); ButtonRefesh(FileSDCard.this); } } }; public void ButtonRefesh(final Context context) { // mnt/sdcard/sime View v=LayoutInflater.from(context).inflate(R.layout.activity_file, null); LinearLayout layout1=(LinearLayout)findViewById(R.id.layout1); layout1.removeAllViews(); for(int i=0;i<FileParent.size();i++) { final String parentpath=FileParent.get(i).getParent(); final String path=FileParent.get(i).getPath(); Button bt=new Button(context); String text= path.substring( path.lastIndexOf("/")+1); bt.setText(text); bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub refeshListView(parentpath); removeButton(path); ButtonRefesh(context); } }); layout1.addView(bt); } } // mnt/sdcard mnt/sdcard/sime mnt /sdcard/sime/lol public void removeButton(String path) { int pos=0; for(int i=0;i<FileParent.size();i++) { Log.v("show",path); if(path.equalsIgnoreCase(FileParent.get(i).getPath())) { pos=i; } } for(int j=pos;j<FileParent.size();) { if(j==0) { FileParent.clear(); } else FileParent.remove(j); } }
讲的比较粗,详细的见代码吧,再次谢谢我的朋友大鹏对我的帮助,代码如果看不懂的可以问我,如果你把功能完善的更好可以发我邮箱 h121baby@sina.cn
相关推荐
在Android开发或者测试过程中,有时候我们需要对安卓模拟器的存储空间进行操作,比如添加应用程序、媒体文件等。这时,就需要了解如何打开并修改安卓模拟器的`sdcard.img`文件。`sdcard.img`文件是Android模拟器中...
本案例聚焦于使用ES文件浏览器进行SD卡文件的操作,它是一款流行的Android文件管理应用,允许用户方便地浏览、编辑和管理设备上的文件。以下是关于"sdcard文件读写案例-ES文件浏览器"的相关知识点: 1. **SD卡访问...
【安卓Android源码——MIUI文件管理器】 在Android操作系统中,MIUI是小米公司推出的一个深度定制的用户界面,它以其丰富的功能和独特的设计深受用户喜爱。本压缩包文件包含的是MIUI文件管理器的源代码,对于开发者...
在Android平台上,对SDCard(外部存储)进行文件操作是应用程序与用户交互的重要部分,尤其对于需要存储大量数据或媒体文件的应用来说。本教程将详细解释如何在Android中读写SDCard文件,非常适合初学者入门。 首先...
总的来说,Android提供了一套完整的API来处理外部存储,开发者可以通过这些工具轻松地实现对SD卡上的文件进行创建、读取、写入、删除、移动和监听等各种操作。在进行文件操作时,一定要确保有足够的权限,并妥善处理...
在Android平台上,对SDCard(外部存储)进行文件读写是移动应用开发中常见的操作,尤其是在涉及用户数据存储、资源管理或实现某些功能(如多媒体播放、文件分享等)时。这个"Android应用源码SdCard读写文件实例"是一...
为了有效地管理和操作SDCard上的文件,开发者需要了解Android的文件系统和相关的API。"安卓SDCard管理器"是一个针对初级Android开发者设计的工具,它提供了对SDCard文件进行增删改查的基本功能。下面将详细讲解如何...
Android SDCard 操作(文件读写、容量计算) ...Android SDCard 操作是 Android 系统中的一种重要功能,开发者需要了解 Environment 类和 File 类的使用方法,并注意 SD 卡的状态和问题,避免出现错误和崩溃。
本实例将探讨如何在Android应用中实现SdCard的读取和写入功能,这涉及到Android的权限管理、文件操作API以及外部存储的相关知识。 1. **权限管理**: 在AndroidManifest.xml文件中,你需要添加`READ_EXTERNAL_...
通过以上方法,开发者可以有效地在Android 2.3及其后续版本中获取和管理内存目录和SDCard目录,为用户提供安全、便捷的文件存储服务。在实际开发中,还需关注Android系统的更新和最佳实践,以保持代码的兼容性和效率...
代码如下:// 读取sdcard文件private void sdcardRead(){String fileName = “/sdcard/my_sdcard.txt”;// assets下文件//String fileName = “/sdcard/test/my_sdcard_test.txt”;// sdcard下子目录文件String ret =...
标题"安卓SD卡文件管理更新信息相关-无需权限将文件保存到sdcard或应用缓存文件中.rar"表明这是一个关于如何在不获取额外权限的情况下,将文件保存到SD卡或应用缓存文件夹的教程或代码示例集合。 首先,我们来了解...
### Android SDCard操作(文件读写,容量计算) #### 概述 本文将详细介绍如何在Android应用中进行SDCard的操作,包括文件的读写以及容量的计算等内容。通过掌握这些知识点,开发者能够更好地利用外部存储空间来提高...
【安卓SD卡文件管理更新信息相关 - 文件选择器】 在Android操作系统中,SD卡(Secure Digital Card)扮演着存储用户数据和应用缓存的重要角色。随着Android系统的不断更新,对SD卡的文件管理也经历了诸多变化,以...
Android7.0 Intent打开文件管理器 获取文件真实路径。虽然网上很多demo,但是没有一个能够兼容所有Android机的,去网上学习了然后自己亲测过手机分别有Android7.0/6.0/4.3个版本。
### Android中SDCard的读写操作详解 #### 一、SDCard访问概述 在Android开发过程中,对于外部存储(如SDCard)的读写是非常常见的需求。本文将详细介绍如何在Android应用中对SDCard进行读写操作,包括获取缓存目录...
在Android平台上,对SDCard(外部存储)进行文件读写是常见的操作,尤其对于需要存储大量数据或用户数据的应用来说。这个"Android应用源码SdCard读写文件实例.zip"压缩包提供了一个示例,帮助开发者理解如何在...
在Android系统中,文件管理器是一个至关重要的组件,它允许用户浏览、操作、创建、删除以及管理设备上的文件和目录。本篇文章将详细探讨一个基于Android的文件管理器源码,旨在帮助初学者理解其核心功能和实现原理,...
使用`java.io.File`类或者`java.nio.file`包中的API来查找和列举SDCard上的所有TXT文件。可以遍历SDCard根目录,通过文件扩展名过滤出TXT文件。 3. **文件读取**: 读取TXT文件内容通常使用`BufferedReader`或`...