自定义android 文件夹管理器

由于近期项目要求,要客户可以自己选择文件夹路径,试了原生的文件夹管理器太难看了,而且还必须选择文件才行,PS:本人菜鸟,只能找到这样的原生方法,还请大佬勿喷,然后没办法就只有自己撸了,还是老规矩,先上效果图:

总体思路

总体思路就是拿到根目录下的文件夹列表,然后通过listView显示出来,最上面放一个... 三点的选项,用于返回上一级,点击当前item的时候就拿到当前item的路径,然后在获取到它的子文件夹数据,然后显示出来,大概就是这个逻辑,简单吧,现在来实现它把

先写个文件夹列表的item,也是很简单的,就显示当前文件夹的文件名和图标,外加一个选中按钮即可

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#fff"android:orientation="vertical" ><RelativeLayout android:layout_width="match_parent"android:layout_height="40dp"android:gravity="center_vertical" ><TextViewandroid:id="@+id/txt_path"android:layout_width="wrap_content"android:layout_height="40dp"android:layout_marginLeft="70dp"android:gravity="center"android:text="path"android:textColor="#000" /><ImageViewandroid:id="@+id/imageView1"android:layout_width="30dp"android:layout_height="30dp"android:layout_marginLeft="20dp"android:src="@android:drawable/sym_contact_card" /><Buttonandroid:id="@+id/btn_choose"android:layout_width="70dp"android:layout_height="30dp"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginRight="20dp"android:background="@drawable/black_circular_background"android:text="Choose"android:textColor="#fff"android:textSize="13sp"android:textStyle="bold" /><RelativeLayoutandroid:id="@+id/rel_file"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginRight="100dp"  ></RelativeLayout></RelativeLayout><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="#999" /></LinearLayout>

大概就是这个样子的

然后在写个适配器 FileAdapter,拿到当前文件夹list数据,显示出来

package com.px.smartairdatabrowser;import java.util.ArrayList;import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;public class FileAdapter extends BaseAdapter {private ArrayList<String>        fileLists;private LayoutInflater                    mInflator;private Activity                      mContext; private setOnItemClick                    callback;public FileAdapter(Activity c, ArrayList<String> mLeGroup) {super();mContext = c;fileLists = mLeGroup;mInflator = mContext.getLayoutInflater();}public void setData(ArrayList<String> data) { this.fileLists = data;}public void setOnItemClick(FileAdapter.setOnItemClick callback) { this.callback = callback;}public ArrayList<String> getData() { return this.fileLists;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn fileLists.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stub return fileLists.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {ViewHolder viewHolder;// General ListView optimization code.if (convertView == null) {convertView = mInflator.inflate(R.layout.item_fileadpter, null);viewHolder = new ViewHolder();viewHolder.filepath = (TextView) convertView.findViewById(R.id.txt_path);  viewHolder.chooseButton = (Button) convertView.findViewById(R.id.btn_choose);viewHolder.relativeLayout = (RelativeLayout) convertView.findViewById(R.id.rel_file);convertView.setTag(viewHolder);} else {viewHolder = (ViewHolder) convertView.getTag();}viewHolder.chooseButton.setVisibility(View.VISIBLE);String data = fileLists.get(position);int location = data.lastIndexOf("/");if (location >= 0) {viewHolder.filepath.setText(data.substring(location));} viewHolder.chooseButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {if (callback != null) {ShowFileActivity.SelPath = fileLists.get(position); callback.onClick(-1);} }}); viewHolder.relativeLayout.setOnClickListener(new OnClickListener() { @Overridepublic void onClick(View arg0) { if (callback != null) {callback.onClick(position);}}});return convertView;}class ViewHolder { TextView     filepath;  Button       chooseButton; RelativeLayout relativeLayout;} interface setOnItemClick{void onClick(int position);}
}

最后核心来了,就是一个Activity,获取文件夹列表

package com.px.smartairdatabrowser;import java.io.File;
import java.util.ArrayList;import com.px.smartairdatabrowser.FileAdapter.setOnItemClick;
import com.px.util.SharedPreferencesUtil;import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.ListView;public class ShowFileActivity extends Activity{private ListView listView1;private ArrayList<String> data = new ArrayList<String>(); private String mPath = "";private FileAdapter fileAdapter;public static String SelPath = "";@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_filesel);listView1 = (ListView)this.findViewById(R.id.listView1);mPath = Environment.getExternalStorageDirectory().getPath();ArrayList<String> data = new ArrayList<String>(); fileAdapter = new FileAdapter(ShowFileActivity.this,data);listView1.setAdapter(fileAdapter);fileAdapter.notifyDataSetChanged();  fileAdapter.setOnItemClick(new setOnItemClick() {@Overridepublic void onClick(int position) {if (position == -1) {ShowFileActivity.this.finish(); SharedPreferencesUtil.saveData("filepath", SelPath);}else {mPath = fileAdapter.getData().get(position);loadDataFrompATH(mPath);//系统版本小于6.0直接加载数据  }}});initData();}public void doBack(View view){ShowFileActivity.this.finish();} public void doBackFile(View view){int start = mPath.lastIndexOf("/");if (start >= 0) {if (mPath.substring(mPath.length() - 1).equals("0")) {ShowFileActivity.this.finish();}else {mPath = mPath.substring(0,start);loadDataFrompATH(mPath); }}else {ShowFileActivity.this.finish();}}private void initData() { loadDataFrompATH(mPath);//系统版本小于6.0直接加载数据}private void loadDataFrompATH(final String mPath) {data.clear();//data为RecyclerView中要显示的数据new Thread() {public void run() {super.run();File file = new File(mPath);File[] listFiles = file.listFiles();//获取子文件for (File f : listFiles) {if (!f.isDirectory() || f.getName().startsWith(".")) {//如果不是路径或者以 . 开头的文件夹 则直接跳过continue;}data.add(f.getAbsolutePath());//往集合中添加符合条件的数据}runOnUiThread(new Runnable() {@Overridepublic void run() {fileAdapter.setData(data);//将数据载入适配器当中fileAdapter.notifyDataSetChanged();}});}}.start();} }

参考的这位大神的文章写的,多谢帮忙解决问题

android 自定义文件夹管理器相关推荐

  1. Android 编程之入门开发文件夹管理器开发详细讲解-1

    在我们的手持设备中,一般都会自带设备公司自己开发的文件管理系统.拍照系统之类的东东,今天我给大伙说说入门级开发的文件夹管理器,代码贼少 总共就6个类吧,没有夹杂其他外部应用,就是一个纯文件夹管理器 A ...

  2. android文件夹管理器源码实现,Android文件夹管理器源码实现

    一.资源管理器介绍 现在在一些移动终端上面都会有自带的资源管理器,其实其并非是Android系统自带,而是手机产商与app开发商的合作而导致融合,借助第三方的开发软件预装在出厂的手机,是新时代下的另一 ...

  3. php实现文件夹管理器,php实现文件管理与基础功能操作

    文件的基本操作 先来看一下PHP文件基础操作,请看强大注释 var_dump(filetype("./img/11.png")); //判断返回得是文件还是目录,返回sile为文件 ...

  4. android 自定义文件夹图标,Launcher3 Android10.0修改文件夹图标为九宫格

    Launcher3 Android10.0修改文件夹图标为九宫格 Launcher3 Android10.0修改文件夹图标为九宫格 文件夹图标在Launcher里表示为预览文件夹 1.修改预览文件夹的 ...

  5. 如何在Windows资源管理器中自定义文件夹背景和图标

    We've covered a lot of Windows tweaks over the years, and today we're going to show you how to custo ...

  6. android sdk文件位置,Android SDK文件夹位于何处?

    我通过Air for Android用Adobe Flash创建了一个.apk应用程序.现在,我想通过这款Blackberry在线打包机为黑莓App World做好准备:https://bdsc.we ...

  7. eclipse中自定义视图_如何在Windows中自定义文件夹视图设置

    eclipse中自定义视图 While the Windows File Explorer seems somewhat simplified compared to older versions, ...

  8. odoo 自定义视图_如何使用Windows的五个模板自定义文件夹视图

    odoo 自定义视图 If you're particular about how Windows displays the contents of your folders, you can cut ...

  9. 如何使用HTML5,JavaScript和Bootstrap构建自定义文件上传器

    by Prashant Yadav 通过Prashant Yadav 如何使用HTML5,JavaScript和Bootstrap构建自定义文件上传器 (How to build a custom f ...

最新文章

  1. java ipv6正则表达式_IPV4和IPV6正则表达式的深入讲解
  2. LA3403天平难题(4个DFS)
  3. EJBCA使用之注册用户及创建证书
  4. Druid 内置Filter配置
  5. j.u.c系列(11)---之并发工具类:Exchanger
  6. 国服服务器_《Minecraft我的世界》第三方服务器的基本储备
  7. 存图利器——链式前向星
  8. Openstack 平台部署安装
  9. UML学习-----类图
  10. POJ1067 HDU1527 取石子游戏【博弈】
  11. [PM2][ERROR] Script not found 和 npm in fork_mode
  12. python之word2vec实战学习
  13. 【优化调度】基于matlab粒子群算法求解水火电调度优化问题【含Matlab源码 1181期】
  14. Linux入门的基础知识点
  15. input type=file标签图片上传路径fakepath问题
  16. Mac下Jmeter基本使用
  17. C语言双向链表的实现
  18. Three.js图像波动特效
  19. Milet谷仓:区块链电商先行者
  20. 测试设备对电路故障判断的影响(为什么你的电源纹波那么大?)

热门文章

  1. 推荐一些助你看透世界本质的书
  2. 【保姆级!完整详细!】小米路由器3 刷openwrt固件并连接上校园网
  3. java解析ip地址_通过JAVA解析IP地址
  4. 《王者荣耀》皮肤个性动作涉嫌抄袭
  5. HIDS逐渐的成为主流
  6. 怎么把word压缩到最小
  7. 第五章--设备内容(The Device Context)(2)
  8. Android 64bit系统中app以32bit运行
  9. 数据挖掘神经网络算法,人工神经网络分析方法
  10. 用计算机测缘分,用两人的姓名测姻缘 免费测试两个人的缘分