Tuesday, April 15, 2014

ActionBar và ListView

Bài viết này sẽ hướng dẫn các bạn sử dụng ActionBar kết hợp với ListView trong Android. Các bạn có thể xem bài viết về ListView tại đây.

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:

Các bạn có thể tải source code project tại đây

No comments:

Post a Comment