package cn.qqtheme.framework.adapter; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import java.io.File; import java.util.ArrayList; import cn.qqtheme.framework.drawable.StateColorDrawable; import cn.qqtheme.framework.entity.FileItem; import cn.qqtheme.framework.icons.FilePickerIcon; import cn.qqtheme.framework.util.CompatUtils; import cn.qqtheme.framework.util.ConvertUtils; import cn.qqtheme.framework.util.FileUtils; import cn.qqtheme.framework.util.LogUtils; /** * 文件目录数据适配 * * @author 李玉江[QQ:1032694760] * @see cn.qqtheme.framework.picker.FilePicker * @since 2014-05-23 18:02 */ public class FileAdapter extends BaseAdapter { public static final String DIR_ROOT = "."; public static final String DIR_PARENT = ".."; private ArrayList<FileItem> data = new ArrayList<FileItem>(); private String rootPath = null; private String currentPath = null; private String[] allowExtensions = null;//允许的扩展名 private boolean onlyListDir = false;//是否仅仅读取目录 private boolean showHomeDir = false;//是否显示返回主目录 private boolean showUpDir = true;//是否显示返回上一级 private boolean showHideDir = true;//是否显示隐藏的目录(以“.”开头) private int itemHeight = 40;// dp private Drawable homeIcon = null; private Drawable upIcon = null; private Drawable folderIcon = null; private Drawable fileIcon = null; public FileAdapter() { homeIcon = ConvertUtils.toDrawable(FilePickerIcon.getHOME()); upIcon = ConvertUtils.toDrawable(FilePickerIcon.getUPDIR()); folderIcon = ConvertUtils.toDrawable(FilePickerIcon.getFOLDER()); fileIcon = ConvertUtils.toDrawable(FilePickerIcon.getFILE()); } public String getCurrentPath() { return currentPath; } /** * 允许的扩展名 */ public void setAllowExtensions(String[] allowExtensions) { this.allowExtensions = allowExtensions; } /** * 是否仅仅读取目录 */ public void setOnlyListDir(boolean onlyListDir) { this.onlyListDir = onlyListDir; } public boolean isOnlyListDir() { return onlyListDir; } /** * 是否显示返回主目录 */ public void setShowHomeDir(boolean showHomeDir) { this.showHomeDir = showHomeDir; } public boolean isShowHomeDir() { return showHomeDir; } /** * 是否显示返回上一级 */ public void setShowUpDir(boolean showUpDir) { this.showUpDir = showUpDir; } public boolean isShowUpDir() { return showUpDir; } /** * 是否显示隐藏的目录(以“.”开头) */ public void setShowHideDir(boolean showHideDir) { this.showHideDir = showHideDir; } public boolean isShowHideDir() { return showHideDir; } public void setItemHeight(int itemHeight) { this.itemHeight = itemHeight; } public void loadData(String path) { if (path == null) { LogUtils.warn("current directory is null"); return; } ArrayList<FileItem> datas = new ArrayList<FileItem>(); if (rootPath == null) { rootPath = path; } LogUtils.verbose("current directory path: " + path); currentPath = path; if (showHomeDir) { //添加“返回主目录” FileItem fileRoot = new FileItem(); fileRoot.setDirectory(true); fileRoot.setIcon(homeIcon); fileRoot.setName(DIR_ROOT); fileRoot.setSize(0); fileRoot.setPath(rootPath); datas.add(fileRoot); } if (showUpDir && !path.equals("/")) { //添加“返回上一级目录” FileItem fileParent = new FileItem(); fileParent.setDirectory(true); fileParent.setIcon(upIcon); fileParent.setName(DIR_PARENT); fileParent.setSize(0); fileParent.setPath(new File(path).getParent()); datas.add(fileParent); } File[] files; if (allowExtensions == null) { if (onlyListDir) { files = FileUtils.listDirs(currentPath); } else { files = FileUtils.listDirsAndFiles(currentPath); } } else { if (onlyListDir) { files = FileUtils.listDirs(currentPath, allowExtensions); } else { files = FileUtils.listDirsAndFiles(currentPath, allowExtensions); } } if (files != null) { for (File file : files) { if (!showHideDir && file.getName().startsWith(".")) { continue; } FileItem fileItem = new FileItem(); boolean isDirectory = file.isDirectory(); fileItem.setDirectory(isDirectory); if (isDirectory) { fileItem.setIcon(folderIcon); fileItem.setSize(0); } else { fileItem.setIcon(fileIcon); fileItem.setSize(file.length()); } fileItem.setName(file.getName()); fileItem.setPath(file.getAbsolutePath()); datas.add(fileItem); } } data.clear(); data.addAll(datas); notifyDataSetChanged(); } public void recycleData() { data.clear(); if (homeIcon instanceof BitmapDrawable) { Bitmap homeBitmap = ((BitmapDrawable) homeIcon).getBitmap(); if (null != homeBitmap && !homeBitmap.isRecycled()) { homeBitmap.recycle(); } } if (upIcon instanceof BitmapDrawable) { Bitmap upBitmap = ((BitmapDrawable) upIcon).getBitmap(); if (null != upBitmap && !upBitmap.isRecycled()) { upBitmap.recycle(); } } if (folderIcon instanceof BitmapDrawable) { Bitmap folderBitmap = ((BitmapDrawable) folderIcon).getBitmap(); if (null != folderBitmap && !folderBitmap.isRecycled()) { folderBitmap.recycle(); } } if (fileIcon instanceof BitmapDrawable) { Bitmap fileBitmap = ((BitmapDrawable) fileIcon).getBitmap(); if (null != fileBitmap && !fileBitmap.isRecycled()) { fileBitmap.recycle(); } } } @Override public int getCount() { return data.size(); } @Override public FileItem getItem(int position) { return data.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { Context context = parent.getContext(); ViewHolder holder; if (convertView == null) { LinearLayout layout = new LinearLayout(context); CompatUtils.setBackground(layout, new StateColorDrawable(Color.WHITE, Color.LTGRAY)); layout.setOrientation(LinearLayout.HORIZONTAL); layout.setGravity(Gravity.CENTER_VERTICAL); int height = ConvertUtils.toPx(context, itemHeight); int matchParent = ViewGroup.LayoutParams.MATCH_PARENT; // fixed: 17-1-8 #79 安卓4.x兼容问题,java.lang.ClassCastException……onMeasure…… if (parent instanceof AbsListView) { layout.setLayoutParams(new AbsListView.LayoutParams(matchParent, height)); } else { layout.setLayoutParams(new ViewGroup.LayoutParams(matchParent, height)); } int padding = ConvertUtils.toPx(context, 5); layout.setPadding(padding, padding, padding, padding); ImageView imageView = new ImageView(context); int wh = ConvertUtils.toPx(context, 30); imageView.setLayoutParams(new LinearLayout.LayoutParams(wh, wh)); imageView.setImageResource(android.R.drawable.ic_menu_report_image); layout.addView(imageView); TextView textView = new TextView(context); LinearLayout.LayoutParams tvParams = new LinearLayout.LayoutParams(matchParent, matchParent); tvParams.leftMargin = ConvertUtils.toPx(context, 10); textView.setLayoutParams(tvParams); textView.setGravity(Gravity.START | Gravity.CENTER_VERTICAL); textView.setSingleLine(); layout.addView(textView); convertView = layout; holder = new ViewHolder(); holder.imageView = imageView; holder.textView = textView; convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } FileItem item = data.get(position); holder.imageView.setImageDrawable(item.getIcon()); holder.textView.setText(item.getName()); return convertView; } private static class ViewHolder { ImageView imageView; TextView textView; } }