标签:
因为今天学习Andorid Sample一个示例的时候需要使用一个选取图片的功能,示例中给的Intent没有办法用,因此,自己搜集资料来实现这个简单的文件浏览器,主要这两个文件就贴在下面了:
首先是模型层,定义显示的文件实体(保存文件对应的Icon和其简易名称与绝对路径)
1 public class DirEntry { 2 private int icon; 3 private String dirName; 4 private String path; 5 6 public String getPath() { 7 return path; 8 } 9 10 public void setPath(String path) { 11 this.path = path; 12 } 13 14 public DirEntry(int icon, String path) { 15 this.icon = icon; 16 this.path=path; 17 this.dirName=new File(path).getName(); 18 } 19 20 public int getIcon() { 21 return icon; 22 } 23 24 public void setIcon(int icon) { 25 this.icon = icon; 26 } 27 28 public String getDirName() { 29 return dirName; 30 } 31 32 public void setDirName(String dirName) { 33 this.dirName = dirName; 34 } 35 }
然后是主要的列表视图实现,注意没有支持后退键,而且使用的是Adapter的观察者方法,因此进入下级目录的时候并非从开头显示(当然这与Android的ListView的实现有关)
1 public class MainActivity extends Activity { 2 3 ArrayList<DirEntry> mDirEntries =new ArrayList<DirEntry>(); 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 requestWindowFeature(Window.FEATURE_NO_TITLE); 9 setContentView(R.layout.activity_main); 10 11 init_list(getString(R.string.root_dir)); 12 13 final FileAdapter adapter=new FileAdapter(mDirEntries); 14 final ListView listView=(ListView)findViewById(R.id.list); 15 16 listView.setAdapter(adapter); 17 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 18 @Override 19 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 20 21 DirEntry dirEntry =(DirEntry)listView.getAdapter().getItem(position);//获取点击的事件 22 23 if(!(new File(dirEntry.getPath()).isDirectory())){//当并非目录的时候返回文件名的绝对路径 24 System.out.println(dirEntry.getPath()); 25 return; 26 } 27 28 mDirEntries.clear(); 29 if(dirEntry.getDirName().equals(getString(R.string.last_dir))){//当获取的目录名称为上级目录的时候 30 File last=new File(dirEntry.getPath()); 31 init_list(last.getParent()); 32 }else { 33 init_list(dirEntry.getPath()); 34 } 35 adapter.notifyDataSetChanged(); 36 } 37 }); 38 } 39 40 public void init_list(String arg){ 41 File[] root=new File(arg).listFiles(); 42 DirEntry dirEntry; 43 if(!arg.equals(getString(R.string.root_dir))){ 44 //当目录并非根目录的时候,将第一个节点定义为上级目录,并将上级目录名定义为其绝对路径名,将显示的名称定义为上级目录 45 dirEntry =new DirEntry(R.drawable.dir_last,arg); 46 dirEntry.setDirName(getString(R.string.last_dir)); 47 mDirEntries.add(dirEntry); 48 } 49 50 if(root==null){ 51 return; 52 } 53 54 for(File dir1:root){ 55 if(dir1.isDirectory()){ 56 dirEntry =new DirEntry(R.drawable.dir_blue,dir1.getAbsolutePath()); 57 }else { 58 dirEntry =new DirEntry(R.drawable.dir_file,dir1.getAbsolutePath()); 59 } 60 mDirEntries.add(dirEntry); 61 } 62 } 63 64 public class FileAdapter extends BaseAdapter{ 65 66 67 private ArrayList<DirEntry> mDirEntries =new ArrayList<DirEntry>(); 68 private LayoutInflater mLayoutInflater; 69 70 public FileAdapter(ArrayList<DirEntry> dirEntries) { 71 mDirEntries = dirEntries; 72 mLayoutInflater=getLayoutInflater(); 73 } 74 75 @Override 76 public int getCount() { 77 return mDirEntries.size(); 78 } 79 80 @Override 81 public DirEntry getItem(int position) { 82 return mDirEntries.get(position); 83 } 84 85 @Override 86 public long getItemId(int position) { 87 return position; 88 } 89 90 @Override 91 public View getView(int position, View convertView, ViewGroup parent) { 92 if(convertView==null) 93 convertView=mLayoutInflater.inflate(R.layout.list_item,parent,false); 94 95 DirEntry dirEntry =getItem(position); 96 97 ImageView icon=(ImageView)convertView.findViewById(R.id.icon); 98 TextView name=(TextView)convertView.findViewById(R.id.name); 99 100 icon.setImageResource(dirEntry.getIcon()); 101 name.setText(dirEntry.getDirName()); 102 103 return convertView; 104 } 105 } 106 }
以上,这样,把上述代码重新写进一个程序中再加以控制就可以实现一个简易返回文件绝对路径的功能,(我觉得可以把它集成到一个Dialog视图中,集成到DialogFragemnt中实现这个简答功能即可)。
实现后的界面:
以上。
标签:
原文地址:http://www.cnblogs.com/lhyz/p/4288983.html