Thursday, April 10, 2014

Custom ListView

Chào các bạn bài viết này mình sẽ hướng dẫn các bạn tạo ra một custom ListView trong Android.

Sau khi hoàn thành chương trình sẽ trông như hình bên dưới:

Đây là một chương trình đơn giản, sử dụng ListView để hiển thị toàn bộ file và folder trong sdcard của thiết bị Android.

Đầu tiên các bạn tạo một android project như hình bên dưới:
Đây là cấu trúc thư mục của project sau khi tạo xong:
  • CustomListViewAdapter.java: lớp này là Adapter, đóng vai trò trung gian giữa giữ liệu(data) và ListView.
  • MainActivity.java: lớp này chịu trách nhiệm hiển thị giao diện chính của chương trình.
  • activity_main.xml: là file định nghĩa layout chính của chương trình.
  • list_item.xml: là file định nghĩa layout của một  item trong ListView.

Để có thể thao tác được với sdcard chúng ta phải thêm permission vào trong file AndroidManifest.xml
activity_main.xml:




    
    


list_item.xml:




    

    

    

        

        

        
    


CustomListViewAdapter.java:


public class CustomListViewAdapter extends BaseAdapter {
 
 private LayoutInflater inflater;
 private File[] listFile;
 private Context context;
 
 public CustomListViewAdapter(Context context, File file){
  this.context = context;
  inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  listFile = file.listFiles();
 }
 

 @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 = new SimpleDateFormat("yyyy MM dd HH:mm:ss");
     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:


public class MainActivity extends ActionBarActivity {

 private ListView listView;
 private CustomListViewAdapter adapter;
 private File file;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  if (isExternalStorageWritable()) {
   listView = (ListView) findViewById(R.id.lv_file_view);
   file = Environment.getExternalStorageDirectory();
   adapter = new CustomListViewAdapter(this, file);
   listView.setAdapter(adapter);
  }
  else{
   Toast.makeText(this, "Can not interact with External Storage!", Toast.LENGTH_LONG).show();
  }
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  // Handle action bar item clicks here. The action bar will
  // automatically handle clicks on the Home/Up button, so long
  // as you specify a parent activity in AndroidManifest.xml.
  int id = item.getItemId();
  if (id == R.id.action_settings) {
   return true;
  }
  return super.onOptionsItemSelected(item);
 }

 /* Checks if external storage is available for read and write */
 public boolean isExternalStorageWritable() {
  String state = Environment.getExternalStorageState();
  if (Environment.MEDIA_MOUNTED.equals(state)) {
   return true;
  }
  return false;
 }
}
link dowload source project: source

4 comments:

  1. Làm sao để đọc được tất cả file explorer hả đại ca, gồm cả .apk ,.tmp bla bla các kiểu :D

    ReplyDelete
    Replies
    1. Chương trình trên đọc được hết tất cả các file mà em :)

      Delete
  2. đang định xóa cái comment ,tối rảnh onl chỉ em vài cái nhé :D

    ReplyDelete