`
h121baby
  • 浏览: 6298 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

SDCard 和File文件操作总结---仿照安卓优化大师文件管理器

阅读更多

 

 最近SDCardFile操作较多,称周末做了个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

  • 大小: 12.6 KB
  • 大小: 12.1 KB
分享到:
评论

相关推荐

    安卓模拟器sdcard.img文件打开修改

    在Android开发或者测试过程中,有时候我们需要对安卓模拟器的存储空间进行操作,比如添加应用程序、媒体文件等。这时,就需要了解如何打开并修改安卓模拟器的`sdcard.img`文件。`sdcard.img`文件是Android模拟器中...

    sdcard文件读写案例-ES文件浏览器

    本案例聚焦于使用ES文件浏览器进行SD卡文件的操作,它是一款流行的Android文件管理应用,允许用户方便地浏览、编辑和管理设备上的文件。以下是关于"sdcard文件读写案例-ES文件浏览器"的相关知识点: 1. **SD卡访问...

    安卓Android源码——MIUI文件管理器.zip

    【安卓Android源码——MIUI文件管理器】 在Android操作系统中,MIUI是小米公司推出的一个深度定制的用户界面,它以其丰富的功能和独特的设计深受用户喜爱。本压缩包文件包含的是MIUI文件管理器的源代码,对于开发者...

    android 写入SDcard 文件

    在Android平台上,对SDCard(外部存储)进行文件操作是应用程序与用户交互的重要部分,尤其对于需要存储大量数据或媒体文件的应用来说。本教程将详细解释如何在Android中读写SDCard文件,非常适合初学者入门。 首先...

    android外部存储文件操作,实现对sdcard上的文件进行操作

    总的来说,Android提供了一套完整的API来处理外部存储,开发者可以通过这些工具轻松地实现对SD卡上的文件进行创建、读取、写入、删除、移动和监听等各种操作。在进行文件操作时,一定要确保有足够的权限,并妥善处理...

    Android应用源码SdCard读写文件实例-IT计算机-毕业设计.zip

    在Android平台上,对SDCard(外部存储)进行文件读写是移动应用开发中常见的操作,尤其是在涉及用户数据存储、资源管理或实现某些功能(如多媒体播放、文件分享等)时。这个"Android应用源码SdCard读写文件实例"是一...

    安卓sdcard管理器

    为了有效地管理和操作SDCard上的文件,开发者需要了解Android的文件系统和相关的API。"安卓SDCard管理器"是一个针对初级Android开发者设计的工具,它提供了对SDCard文件进行增删改查的基本功能。下面将详细讲解如何...

    Android_SDCard操作(文件读写,容量计算).

    Android SDCard 操作(文件读写、容量计算) ...Android SDCard 操作是 Android 系统中的一种重要功能,开发者需要了解 Environment 类和 File 类的使用方法,并注意 SD 卡的状态和问题,避免出现错误和崩溃。

    Android应用源码SdCard读写文件实例

    本实例将探讨如何在Android应用中实现SdCard的读取和写入功能,这涉及到Android的权限管理、文件操作API以及外部存储的相关知识。 1. **权限管理**: 在AndroidManifest.xml文件中,你需要添加`READ_EXTERNAL_...

    Android 文件 内存目录获取 sdcard目录获取

    通过以上方法,开发者可以有效地在Android 2.3及其后续版本中获取和管理内存目录和SDCard目录,为用户提供安全、便捷的文件存储服务。在实际开发中,还需关注Android系统的更新和最佳实践,以保持代码的兼容性和效率...

    android读取sdcard路径下的文件的方法

    代码如下:// 读取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卡文件管理更新信息相关-无需权限将文件保存到sdcard或应用缓存文件中.rar"表明这是一个关于如何在不获取额外权限的情况下,将文件保存到SD卡或应用缓存文件夹的教程或代码示例集合。 首先,我们来了解...

    Android_SDCard操作(文件读写,容量计算)

    ### Android SDCard操作(文件读写,容量计算) #### 概述 本文将详细介绍如何在Android应用中进行SDCard的操作,包括文件的读写以及容量的计算等内容。通过掌握这些知识点,开发者能够更好地利用外部存储空间来提高...

    安卓SD卡文件管理更新信息相关-文件选择器.zip

    【安卓SD卡文件管理更新信息相关 - 文件选择器】 在Android操作系统中,SD卡(Secure Digital Card)扮演着存储用户数据和应用缓存的重要角色。随着Android系统的不断更新,对SD卡的文件管理也经历了诸多变化,以...

    Android7.0 Intent打开文件管理器 获取文件真实路径

    Android7.0 Intent打开文件管理器 获取文件真实路径。虽然网上很多demo,但是没有一个能够兼容所有Android机的,去网上学习了然后自己亲测过手机分别有Android7.0/6.0/4.3个版本。

    android中sdcard的读写.doc

    ### Android中SDCard的读写操作详解 #### 一、SDCard访问概述 在Android开发过程中,对于外部存储(如SDCard)的读写是非常常见的需求。本文将详细介绍如何在Android应用中对SDCard进行读写操作,包括获取缓存目录...

    Android应用源码SdCard读写文件实例.zip

    在Android平台上,对SDCard(外部存储)进行文件读写是常见的操作,尤其对于需要存储大量数据或用户数据的应用来说。这个"Android应用源码SdCard读写文件实例.zip"压缩包提供了一个示例,帮助开发者理解如何在...

    Android FileManager文件管理器源码

    在Android系统中,文件管理器是一个至关重要的组件,它允许用户浏览、操作、创建、删除以及管理设备上的文件和目录。本篇文章将详细探讨一个基于Android的文件管理器源码,旨在帮助初学者理解其核心功能和实现原理,...

    android读取sdcard的txt文件,翻书的效果

    使用`java.io.File`类或者`java.nio.file`包中的API来查找和列举SDCard上的所有TXT文件。可以遍历SDCard根目录,通过文件扩展名过滤出TXT文件。 3. **文件读取**: 读取TXT文件内容通常使用`BufferedReader`或`...

Global site tag (gtag.js) - Google Analytics