Android Smart Dict - 单词导入 - 文件浏览器
2011-03-29 04:30
453 查看
搞定了数据库之后,我要想办法把单词导入进来。怎么做呢?首先找到我要导入的文件,然后导入单词。
我做了一个简单的文件浏览器,可以去sdcard里面找我需要导入的文件。我需要自己定义一种词库的文件格式和后缀名,这个不重要,目前我只需要简单的定义就好,后面再做优化。后缀名就定为“.dict",那么首先需要搞定这个文件浏览器。当然我可以用Grid View来显示文件,就像home界面的桌面一样。用户点击文件夹后进入下一级文件目录,点击文件之后判断是否是".dict"结尾的文件,如果是就加载,否则不予处理,或者显示提示信息。
这里有一个重要的问题就是,我们在读取文件的时候不能在UI主线程里边做,这样有可能会阻塞进而导致讨厌的ANR被弹出来。我们可以自定义新的线程,当然也可以使用AsyncTask来做。我这里就用android系统的AsyncTask来做,定义一个task名叫LoadFileInfoTask,主要就是用来读取文件,取得文件信息,封装成一个定义好的FileInfo类,里面只有三个属性,文件名,路径和图片,如果是我们的词库文件就显示词库图片,依次类推。最后要注意一点,execute这个AsyncTask需要在UI线程里边来做,否则会抛异常。
具体代码如下:
有了这个task,我们就可以在每次点击文件夹以后运行这个task取得下一级路径的文件信息。
然后,定义一个grid view,用来显示文件信息。还有相应的Adapter,每次显示的时候更新数据。
代码如下:
好了,今天主要的两个东西就是:
LoadFileInfoTask:主要用来取得文件信息。
GridView:主要用来显示文件信息,获得用户的点击之后判断是否显示下一级目录,或者加载文件。
来看看运行效果:
我做了一个简单的文件浏览器,可以去sdcard里面找我需要导入的文件。我需要自己定义一种词库的文件格式和后缀名,这个不重要,目前我只需要简单的定义就好,后面再做优化。后缀名就定为“.dict",那么首先需要搞定这个文件浏览器。当然我可以用Grid View来显示文件,就像home界面的桌面一样。用户点击文件夹后进入下一级文件目录,点击文件之后判断是否是".dict"结尾的文件,如果是就加载,否则不予处理,或者显示提示信息。
这里有一个重要的问题就是,我们在读取文件的时候不能在UI主线程里边做,这样有可能会阻塞进而导致讨厌的ANR被弹出来。我们可以自定义新的线程,当然也可以使用AsyncTask来做。我这里就用android系统的AsyncTask来做,定义一个task名叫LoadFileInfoTask,主要就是用来读取文件,取得文件信息,封装成一个定义好的FileInfo类,里面只有三个属性,文件名,路径和图片,如果是我们的词库文件就显示词库图片,依次类推。最后要注意一点,execute这个AsyncTask需要在UI线程里边来做,否则会抛异常。
具体代码如下:
private class LoadFileInfoTask extends AsyncTask<String, Void, Boolean>{ private String path; private FileInfo[] list; @Override protected Boolean doInBackground(String... _path) { path = _path[0]; final File file = new File(path); if(file.isFile()) { // Load book file if (path.endsWith(BOOK_FILE_SUFFIX)) { loadBook(file); } // It is not the book file else { FileLoaderActivity.this.runOnUiThread(new Runnable() { public void run() { Toast.makeText(FileLoaderActivity.this, R.string.toast_not_book_file, Toast.LENGTH_SHORT).show(); } }); } return false; } else { list = getFileInfo(file); return true; } } @Override protected void onPostExecute(Boolean isPath) { if(isPath) { if(mFileAdapter == null) { mFileAdapter = new FileAdapter(list, path); mFileGrid.setAdapter(mFileAdapter); } else { mFileAdapter.updateData(list, path); } setTitle(path); } } private FileInfo[] getFileInfo(File directory) { File[] files; FileInfo[] list; files = directory.listFiles(new FileFilter() { public boolean accept(File file) { return file.canRead() && !file.isHidden(); } }); if(files == null) { return null; } list = new FileInfo[files.length]; for (int i = 0; i < files.length; i++) { list[i] = new FileInfo(); list[i].name = files[i].getName(); String subPath = files[i].getAbsolutePath(); // If it is a directory if (files[i].isDirectory()) { list[i].path = Utils.formatDirectory(subPath); list[i].icon = R.drawable.file_folder; } // If it is a file else { list[i].path = subPath; // Filter book files; if (list[i].name.endsWith(BOOK_FILE_SUFFIX)) { list[i].icon = R.drawable.file_book; } else { list[i].icon = R.drawable.file_unknown; } } } return list; } }
有了这个task,我们就可以在每次点击文件夹以后运行这个task取得下一级路径的文件信息。
然后,定义一个grid view,用来显示文件信息。还有相应的Adapter,每次显示的时候更新数据。
代码如下:
/** * Adapter for file info grid view; */ private class FileAdapter extends BaseAdapter { private FileInfo[] mList; private LayoutInflater inflater; public FileAdapter(FileInfo[] list, String path) { inflater = getLayoutInflater(); updateData(list, path); } public int getCount() { return mList.length; } public Object getItem(int position) { return mList[position]; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = inflater.inflate(R.layout.file_grid_item, parent, false); } TextView text = (TextView) convertView.findViewById(R.id.label); FileInfo info = mList[position]; text.setText(info.name); text.setCompoundDrawablesWithIntrinsicBounds(0, info.icon, 0, 0); text.setTag(info.path); return convertView; } public void updateData(final FileInfo[] list, final String path) { // If current path is not root, we have to show one more item for parent path. // Otherwise, do not; if(path.equals(PATH_ROOT)) { mList = list; } else { // If list is null just parent will be shown; if(list == null) { mList = new FileInfo[1]; // Just one item for parent; mList[0] = new FileInfo(PATH_PARENT_NAME, R.drawable.file_folder, Utils.getParentPath(path)); } else { final int length = list.length; mList = new FileInfo[length + 1]; System.arraycopy(list, 0, mList, 0, length); // One more item for parent; mList[length] = new FileInfo(PATH_PARENT_NAME, R.drawable.file_folder, Utils.getParentPath(path)); } } // Notify refresh itself; notifyDataSetChanged(); } }
好了,今天主要的两个东西就是:
LoadFileInfoTask:主要用来取得文件信息。
GridView:主要用来显示文件信息,获得用户的点击之后判断是否显示下一级目录,或者加载文件。
来看看运行效果:
相关文章推荐
- Android Smart Dict - 单词导入 - 词汇表解析
- Android Smart Dict - 显示单词详细内容
- Android Smart Dict - 查询界面
- Android Smart Dict - 开篇
- Android Studio导入Eclipse开源项目(SmartImageView为例)
- Android Smart-Dict - 创建工程
- Android Smart Dict - 关于功能的思考
- Android Smart Dict - 数据库设计
- 【Android】oui.txt格式化的sqlite数据库文件直接导入
- ANDROID L——RecyclerView,CardView导入和使用(Demo)
- Android-Ubuntu系统中使用Android studio并导入Android5.1源码
- android是根据什么去选择drawable文件夹下的三种图片(png,jpg,gif)?图片导入
- Android导入一个工程时提示 Invalid project description的解决方法
- 如何将android stdio的工程导入到eclipse
- android 导入项目 项目中文字乱码问题
- Android_androidstudio 导入项目后卡死问题(building gradle project info)
- android 通话记录的导入/导出
- Android工程文件导入Jar包和So第三方库
- Android项目——导入工程出错的解决问题
- 导入Android项目缺少Support\v7报错