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