package nico.styTool; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.ContextMenu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; public class FileList extends AppCompatActivity { ListView list; static List<String> dirs_name; static List<String> files_name; //缓存上层目录 /******************* *缓存有两种情况被清空 *1,按返回上层目录之后。 *2,重新载入Activity后 ********************/ static List<String> dirs_name_cache; static List<String> files_name_cache; Map<String,String> map_paths_name,map_files_name; /** Called when the activity is first created. */ android.support.v7.widget.Toolbar toolbar; static String broadcastAction=""; static String selectedFilePath=null; static String curpath="/mnt/sdcard"; static String filter=""; List<Map<String, Object>> items; Map<String, Object> item; @Override protected void onStart() { // TODO: Implement this method super.onStart(); toolbar.setTitle("云工具"); // 设置标题 // 设置副标题 toolbar.setNavigationIcon(R.drawable.ic_arrow_back_white_24dp); // 设置导航图标 toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View p1) { finish(); } }); // 设置导航按钮监听 } @Override protected void onCreate(Bundle savedInstanceState) { // TODO: Implement this method super.onCreate(savedInstanceState); setContentView(R.layout.filelist); toolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar); // 初始化Toolbar控件 setSupportActionBar(toolbar); // 用Toolbar取代ActionBar //toolbar.setTitleTextColor(getResources().getColor(R.color.text_font_white));//标题颜色 //toolbar.setSubtitleTextColor(getResources().getColor(R.color.text_font_white));//副标题颜色 list = (ListView)findViewById(R.id.file_list); try { //getListFromPath(curpath); loadList(); } catch (Exception e) {//错误时获取根目录 curpath = "/"; getListFromPath(curpath); loadList(); } //这些事件放在载入列表之后,可以加快载入列表的速度 //上下文菜单事件 list.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener(){ @Override public void onCreateContextMenu(ContextMenu p1, View p2, ContextMenu.ContextMenuInfo p3) { if (((AdapterContextMenuInfo)p3).position > (dirs_name.size() - 1)) p1.add(0, 0, 0, "查看图片"); } }); //设置列表单击事件 list.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> p1, View p2, int position, long p4) { // TODO: Implement this method //点击返回上级时 if (position == 0 && !curpath.equals("/")) { try { curpath = new File(curpath).getParent(); //缓存都不为空时才能使用缓存 if (dirs_name_cache != null && files_name_cache != null) { dirs_name = dirs_name_cache; files_name = files_name_cache; //使用后清空缓存 dirs_name_cache = null; files_name_cache = null; } else { getListFromPath(curpath); } loadList(); } catch (Exception e) { showToast("发生了错误!"); } } //点击文件夹时 else if ((position == 0 && curpath.equals("/")) || (position < dirs_name.size() && position != 0)) { try { dirs_name_cache = dirs_name; files_name_cache = files_name; //对根目录的处理 if (curpath.equals("/")) curpath = ""; curpath = curpath + "/" + dirs_name.get(position); getListFromPath(curpath); loadList(); } catch (Exception e) { //发生异常时,当前路径不变,并重新载入列表 File f=new File(curpath); curpath = f.getParent(); getListFromPath(curpath); loadList(); showToast("发生了错误!"); } } //点击文件时 else if (position > (dirs_name.size() - 1)) { //if ((curpath.charAt(curpath.length() - 1) == '/')) //curpath = curpath.substring(0, curpath.length() - 1); selectedFilePath = curpath + "/" + files_name.get(position - dirs_name.size()); showToast(selectedFilePath); //结束 //overridePendingTransition(R.anim.null_anim, R.anim.out_to_bottom); FileList.this.finish(); //发送广播 Intent intent=new Intent(); intent.setAction(broadcastAction); sendBroadcast(intent); } } }); } //点击Context菜单的项时发生 @Override public boolean onContextItemSelected(MenuItem item) { AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo(); // TODO: Implement this method if (item.getItemId() == 0) { //预览 Intent intent = new Intent("android.intent.action.VIEW"); intent.addCategory("android.intent.category.DEFAULT"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = Uri.fromFile(new File(curpath + "/" + files_name.get(menuInfo.position - dirs_name.size()))); intent.setDataAndType(uri, "image/*"); startActivity(intent); } return super.onOptionsItemSelected(item); } //在调用该方法之前务必先调用getListFromPath方法 public void loadList() { //getListFromPath(curpath); items = new ArrayList<Map<String,Object>>(); for (int i = 0; i < dirs_name.size() ; i++) { item = new HashMap<String, Object>(); item.put("imageItem", R.drawable.ic_save_white_24dp); item.put("textItem", dirs_name.get(i)); items.add(item); } for (int i = 0; i < files_name.size() ; i++) { item = new HashMap<String, Object>(); item.put("imageItem", R.drawable.image); item.put("textItem", files_name.get(i)); items.add(item); } //实例化一个适配器 SimpleAdapter adapter = new SimpleAdapter(this, items,R.layout.filelist_item,new String[]{"imageItem", "textItem",""},new int[]{R.id.filelist_item_iv, R.id.filelist_item_tv}); list.setAdapter(adapter); //显示的更加人性化 setTitle(getShortPath(curpath)); //getActionBar().setTitle(getShortPath(curpath)); } public static String getShortPath(String path) { int n=0,p=0; for (int i=0;i < path.length();i++) if (path.charAt(i) == '/') n++; if (n >= 3) { for (int i=0;i < path.length();i++) { if (path.charAt(i) == '/') p++; if (p == n - 1) { String newPath = "..." + path.substring(i, path.length()); return newPath; } } } return path; } //载入列表到数组 public static void getListFromPath(String path) { files_name = new ArrayList<String>(); dirs_name = new ArrayList<String>(); File file = new File(path); File[] files = file.listFiles(); //不是根目录添加返回项 if (!curpath.equals("/")) dirs_name.add(".."); for (int i=0;i < files.length;i++) { //添加文件夹名 if (files[i].isDirectory()) { dirs_name.add(files[i].getName() + ""); } //文件符合,添加文件名 else if (files[i].isFile() && files[i].getName().matches(filter)) { files_name.add(files[i].getName()); } } //对数组进行排列 Collections.sort(dirs_name, String.CASE_INSENSITIVE_ORDER); Collections.sort(files_name, String.CASE_INSENSITIVE_ORDER); } public void showToast(String text) { Toast.makeText(FileList.this, text, 2000).show(); } }