文档章节

联系人助手 4. 实现文件的浏览

c
 chuiyuan
发布于 2014/04/30 22:29
字数 759
阅读 63
收藏 1

    方便用户选择要导入 的文件或者 选择要导出和文件的保存路径。

一. 整体设计 

整体设计中 ,我们完成 了界面 的初始化,并实现 了列表事的单击事件和长按事件、


二、实现  getFileDir()方法

用于显示目前 的文件路径 ,并显示 这个 路径下面的文件列表 。

(1) 通过传递进来 的文件路径 得到文件对象 

(2)通过 File.listFiles()得到这个方法下面的子文件的列表 、

(3)将文件列表 下面的文件名和文件路径 取出来 分别 保存在两个List中,

(4)用新的List 构造 Adapter

(5)设置Adapter 进行界面 的显示 


三。实现 returnFilePath()方法

    用于得到文件的路径 ,并将之设定为Activity的 result,传递回发起端的 Activity

public class FileSearch extends ListActivity{
	private List<String >items =null;
	private List<String >paths =null;
	private String rootPath ="/";
	private ListView mList ;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.list);
		
		mList =(ListView)findViewById(android.R.id.list);
		mList.setOnItemLongClickListener(new OnItemLongClickListener(){
			public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
					int position, long arg3) {
				// TODO Auto-generated method stub
				File file = new File(paths.get(position));
				if (!file.canRead()){
					Toast.makeText(getBaseContext(), "权限不够", Toast.LENGTH_SHORT).show();
					return true ;
				}
				returnFilePath(file);
				return false;
			}
		});
		
		getFileDir (rootPath);
		Toast.makeText(getBaseContext(), "长按文件夹选择路径", Toast.LENGTH_SHORT).show();
		
	}
	
	protected void onListItemClick(ListView l ,View v ,int position  ,long id ){
		File file = new File(paths.get(position));
		if (!file.canRead()){
			Toast.makeText(getBaseContext(), "权限不够", Toast.LENGTH_SHORT).show();
			return  ;
		}
		if (file.isDirectory()){
			getFileDir(paths.get(position));
		}else {
			returnFilePath(file);
		}
	}
	private void getFileDir(String filePath) {   //filePath ,传进来 的文件路径
		// TODO Auto-generated method stub
		this.setTitle(filePath);  //显示当前 的路径 
		items= new ArrayList<String >();
		paths = new ArrayList<String >();
		
		File f= new File(filePath);
		File [] files = f.listFiles();     //得到子文件列表 
		
		if (!filePath.equals(rootPath)){
			items.add("backRoot");
			paths.add(rootPath);
			items.add("back");
			paths.add(f.getParent());  //得到上级目录 
		}
		
		for ( int i=0;i<files.length;i++){   //遍历  files文件
			File file = files[i];
			items.add(file.getName());   //得到文件名
			paths.add(file.getPath());
		}
		setListAdapter (new MyAdapter(this ,items ,paths ));
	}
	protected void returnFilePath(File file) {
		// TODO Auto-generated method stub
		String filePath = file.getPath();
		Intent i = getIntent();
		Bundle bundle = new Bundle ();    //Bunlde结构相当 于Map
		bundle.putString("filePath", filePath);
		i.putExtras(bundle);
		setResult(RESULT_OK,i);
		finish();
		
	}

四,实现 MyAdapter类

  文件名列表 与视图有效地绑定在一起,这个 时候 我们要有两个数据 源,文件名的list 和文件路径 的list .

public class MyAdapter extends BaseAdapter {
	private LayoutInflater mInflater ;
	private Bitmap bm1;
	private Bitmap bm2;
	private Bitmap bm3;
	private Bitmap bm4;
	private List<String>items;
	private List <String>paths;
	
	public MyAdapter(Context context, List<String> item,
			List<String> path) {
		mInflater =  LayoutInflater.from(context);
		items = item;
		paths = path;
		bm1= BitmapFactory.decodeResource(context.getResources(), 
										R.drawable.back01);
		bm2 = BitmapFactory.decodeResource(context.getResources(), 
										R.drawable.back02);
		bm3= BitmapFactory.decodeResource(context.getResources(), 
										R.drawable.folder);
		bm4= BitmapFactory.decodeResource(context.getResources(), 
				R.drawable.doc);
	}

	public int getCount() {
		return items.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return items.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) {
		// TODO Auto-generated method stub
		ViewHolder holder ;
		
		if (convertView==null){
			convertView = mInflater.inflate(R.layout.file_row, null);
			holder = new ViewHolder();
			holder.text =(TextView)convertView.findViewById(R.id.text);
			holder.icon=(ImageView)convertView.findViewById(R.id.icon);
			convertView.setTag(holder);
		}else{
			holder = (ViewHolder)convertView.getTag();
		}
		
		File f = new File(paths.get(position).toString());
		if (items.get(position).toString().equals("backRoot")){
			holder.text.setText("返回根目录");
			holder.icon.setImageBitmap(bm1);
		}else if (items.get(position).toString().equals("back")){
			holder.text.setText("返回上一级");
			holder.icon.setImageBitmap(bm2);
		}else {
			holder.text.setText(f.getName());
			if (f.isDirectory()){
				holder.icon.setImageBitmap(bm3);
			}else {
				holder.icon.setImageBitmap(bm4);
			}
		}
		return convertView;
	}
	
	private TextView findViewById(int text) {
		// TODO Auto-generated method stub
		return null;
	}

	private class ViewHolder{
		TextView text;
		ImageView icon;
	}

}


© 著作权归作者所有

共有 人打赏支持
c
粉丝 9
博文 92
码字总数 40993
作品 0
海淀
私信 提问
微信公众号获取精准粉丝方法?

     微信公众号获取精准粉丝方法?应该可以说粉丝就是公众号的生命,最近很多微信用户问我微信公众号获取精准粉丝方法?下面小编就带你了解一下微信公众号获取精准粉丝方法?      微信...

公众开发运营官网
02/28
0
0
将联系人信息导出为CSV和VCF格式文件

  上篇文章中,我们介绍了如何从csv和vcf格式的文件中获取联系人信息。链接:http://blog.csdn.net/github_36878269/article/details/76696685 这次我们反着来,将联系人信息导出为这两种格...

github_36878269
2017/08/05
0
0
中国移动灵犀云语音识别SDK(android)使用介绍

随着智能家居概念的火热,语音交互这一新时代的人机交互方式再度掀起了热潮。移动互联网应用在设计开发时也纷纷考虑加入语音识别功能,带给用户除传统键盘或触控交互方式外的更便捷交互体验。...

iherro
2015/02/02
2.5K
4
智能音箱Echo秘密记录谈话 亚马逊:Alexa误判了指令

据西雅图当地媒体KIRO7称,亚马逊旗下智能音箱产品Echo可能会秘密记录你的谈话内容,某些情况下,还可能将其发送给其他人。这种事情就发生在了位于美国俄勒冈州波特兰市的一个家庭中,放置在...

新浪科技
05/25
0
0
EDM邮箱营销系统

无限制的图片文件夹 图片的在线浏览 发送的历史附件管理 全面的数据汇总报告 用户行为的监控 发送结果的分类导出 任意多次发送情况的对比分析 打开和链接点击即时反馈 批量处理联系人信息 任...

林天荫
2016/07/29
1
0

没有更多内容

加载失败,请刷新页面

加载更多

数据集汇总

1.朝鲜语,英语混合数据集 http://www.iapr-tc11.org/mediawiki/index.php/KAIST_Scene_Text_Database 2.OCR资源博客 https://github.com/tangzhenyu/Scene-Text-Understanding 3.阿拉伯语英......

clgo
3分钟前
0
0
Linux时间同步方式

https://blog.csdn.net/sunny_future/article/details/78279726

呼呼南风
5分钟前
0
0
Hashtable程序员面试五分钟被请出来了

你们可能会想,栈长这么菜的吗?5分钟都坚持不了? 本文说起来会有点尴尬,毕竟这是栈长我曾经经历过的故事。。。 那时候的栈长还真菜,每天写着 if/ for 及一些简单的业务逻辑代码,虽工作有...

金铭鼎IT教育
8分钟前
0
0
Docker安装rabbitmq

安装rabbitmq,要先安装erlang,有点麻烦,如果使用Docker方式来安装rabbitmq,那就不需要预先安装erlang了。 1、下载rabbitmq镜像 List-1 在docker hub上rabbitmq的tag很多,但是我们使用3...

克虏伯
8分钟前
0
0
架构师究竟要不要写代码?

Talk is cheap, show me the code! 但是在互联网企业中,身处技术要职的架构师到底需不需要写代码? 在我们的专业领域中有一种普遍存在的误解:架构师的工作不需要写代码。 就目前看来这似乎...

我的卡
10分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部