Chương trình hoàn thiện sẽ có giao diện như hình bên dưới, phần ListView sẽ hiển thị danh sách các thư mục có trong sdcard, cho phép chọn nhiều item trong ListView, lọc các file bằng search box trên ActionBar.
ActionBar xuất hiện trong Android từ phiên bản 3.0(API level 11), nhưng bạn có thể sử dụng ActionBar thông qua Support Library cho các phiên bản từ 2.1(API level 7) trở lên. Trong bài viết này mình sẽ sử dụng Support Library, các bạn có thể tìm hiểu các thức setup Support Library tại đây.
Đầu tiên các bạn tiến hành tạo project mới như hình bên dưới
Các thư mục chính trong project:
- scr gồm có 2 class:
- CustomListViewAdapter.java: sử dụng cho ListView
- MainActivity.java: chứa các thành phần chính của chương trình.
- drawable:
- Hai file hình ảnh là icon của file và folder
- background_selected.xml, background_deselected.xml, list_item_background_selector.xml được dùng cho các trạng thái khác nhau của ListView item.
- layout, menu:
- activity_main.xml: định nghĩa giao diện chính của chương trình
- list_item.xml: giao diện của một item trong ListView
- action_mode.xml: định nghĩa menu trong action mode.
- main.xml: menu chính của chương trình.
- AndroidManifest.xml:
- activity_main.xml:
- list_item.xml:
- list_item_background_selector.xml:
- background_selected.xml:
- background_deselected.xml:
- action_mode.xml:
- main.xml:
- CustomListViewAdapter.java:
public class CustomListViewAdapter extends BaseAdapter { private LayoutInflater inflater; private File[] listFile; private Context context; public CustomListViewAdapter(Context context, File[] files){ this.context = context; inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); listFile = files; } @Override public int getCount() { return listFile.length; } @Override public Object getItem(int position) { return listFile[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if(convertView == null) convertView = inflater.inflate(R.layout.list_item, null); ImageView iv = (ImageView) convertView.findViewById(R.id.iv_icon); TextView tvFileName = (TextView) convertView.findViewById(R.id.tv_file_name); TextView tvFileSize = (TextView) convertView.findViewById(R.id.tv_file_size); TextView tvDateModify = (TextView) convertView.findViewById(R.id.tv_date_modify); File file = listFile[position]; long size = 0; if(file.isDirectory()){ size = folderSize(file); iv.setImageDrawable(context.getResources().getDrawable(R.drawable.folder_icon)); } else{ iv.setImageDrawable(context.getResources().getDrawable(R.drawable.file_icon)); size = file.length(); } tvFileName.setText(file.getName()); tvFileSize.setText(readableFileSize(size)); tvDateModify.setText(convertTime(file.lastModified())); return convertView; } public static String readableFileSize(long size) { if(size <= 0) return "0 B"; final String[] units = new String[] { "B", "KB", "MB", "GB", "TB" }; int digitGroups = (int) (Math.log10(size)/Math.log10(1024)); return new DecimalFormat("#,##0.#").format(size/Math.pow(1024, digitGroups)) + " " + units[digitGroups]; } public String convertTime(long time){ Date date = new Date(time); Format format = DateFormat.getDateInstance(); return format.format(date).toString(); } public static long folderSize(File directory) { long length = 0; for (File file : directory.listFiles()) { if (file.isFile()) length += file.length(); else length += folderSize(file); } return length; } }
- MainActivity.java:
No comments:
Post a Comment