
功能需求
跟普通的文件管理器一样,读取内置存储或者U盘文件显示出来.包含:文件类型区分,打开,增删改查,多选,排序
适配器代码
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View convertView = null;
int type = PreferencesUtil.getKeyViewType(); //显示样式类型,0为Grid,0,2之外为List
if (type == 0) {
if (BaseActivity.mIsWindowMode) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.adp_file_item_window, parent, false);
} else {
convertView = LayoutInflater.from(mContext).inflate(R.layout.adp_file_item, parent, false);
}
} else if (type == 2) {
if (BaseActivity.mIsWindowMode) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.adp_file_item_small_window, parent, false);
} else {
convertView = LayoutInflater.from(mContext).inflate(R.layout.adp_file_item_small, parent, false);
}
} else {
convertView = LayoutInflater.from(mContext).inflate(R.layout.adp_file_list_item, parent, false);
}
return new FileRecyclerHolder(convertView, type);
}
@SuppressLint("WrongConstant")
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) {
boolean isEven;
FileRecyclerHolder holder = (FileRecyclerHolder) viewHolder;
//改变条目的背景颜色
if (position % 2 == 0) {
isEven = true;
} else {
isEven = false;
}
int keyViewType = PreferencesUtil.getKeyViewType();
XZFile file = mCacheData.get(position);
final int pos = 0;
holder.itemView.setOnClickListener(new FileItemClickListener(position, holder));
holder.itemView.setOnLongClickListener(new FileItemLongClickListener(position, holder));
if (file != null) {
if (file.getPath().equals(FileUtil.getInternalStoragePath())) {
holder.text.setText(R.string.built_in_storage);
} else if (file.getPath().equals(System.getenv("SECONDARY_STORAGE"))) {
holder.text.setText(R.string.sdcard_stroage);
} else if (file.getPath().equals(Config.USB_PATH)) {
holder.text.setText(R.string.internal_stroage);
} else {
holder.text.setText(file.getName());
}
// LogUtils.d(TAG,"onBindViewHolder,position:" + position + ",file name:" + file.getName());
FileType fileType = file.getFileType();
//根据文件类型加载图标
loadIcon(holder, file, fileType);
if (SPUtil.contains(mContext, file.getName())) {
holder.lock.setVisibility(View.VISIBLE);
holder.checkBox.setEnabled(false);
} else {
holder.lock.setVisibility(View.GONE);
}
holder.checkBox.setVisibility(FileActivity.isEdit ? View.VISIBLE : View.GONE);
holder.checkBox.setChecked(getIsChecked().get(position) == null ? false : getIsChecked().get(position));
holder.checkBox.setOnClickListener(new CheckedChangeListener(position, holder));
// 列表模式的时间、大小
if (keyViewType == 1) {
String time = file.getTime();
if(time.startsWith("1970")){
time = "2018/01/01";
}
holder.tv_modify_date.setText(time);
TextView textView = holder.tv_file_size;
String tag = (String) textView.getTag();
String url = file.getPath();
if (file.isGetSize()) {
holder.tv_file_size.setText(file.getSize());
} else {
if (!url.equals(tag)) {
holder.tv_file_size.setText("--");
}
if (mIsGridViewIdle) {
textView.setTag(url);
mLoader.bindFileSize(textView, file);
}
}
if (isEven) {
holder.linear_file_item.setBackgroundResource(R.drawable.item_list_even_selector);
} else {
holder.linear_file_item.setBackgroundResource(R.drawable.item_list_odd_selector);
}
}
if (isChecked.get(position)) {
holder.linear_file_item.setSelected(true);
} else {
holder.linear_file_item.setSelected(false);
}
if (position == mCacheData.size() - 1 && mCacheData.size() == mData.size() && isFirstLoading) {
// System.out.println("加載完畢");
if (mOnLoadingListener != null)
mOnLoadingListener.onLoadingFinished();
isFirstLoading = false;
}
if (position == 0 && isFirstStart) {
if (mOnLoadingListener != null)
mOnLoadingListener.onLoading();
isFirstStart = false;
}
// addData();
}
}
/**根据文件类型加载文件图标
* @params holder holderr
* @params file 文件对象
* @fileType 文件类型
*/
private void loadIcon(FileRecyclerHolder holder, XZFile file, FileType fileType) {
if (fileType == FileType.APK) {//apk类型
if (mIsGridViewIdle) {
holder.image.setImageDrawable(FileUtil.getUninstallApkIcon(mContext, file.getPath()));
}
} else if (file.getFileType() == FileType.PICTURE) {
//0大图标 1列表 2小图标
if (PreferencesUtil.getKeyViewType() == 0) {//大图标
if (file.getName().toLowerCase().endsWith(".vpd")) {
if(bitmapMap.get(R.drawable.ic_vpd) == null){
bitmapMap.put(R.drawable.ic_vpd, BitmapFactory.decodeResource(activity.getResources(), R.drawable.ic_vpd));
}
holder.image.setImageBitmap(bitmapMap.get(R.drawable.ic_vpd));
} else {
if (mIsGridViewIdle) {
holder.image.setTag(file.getPath())
setListImage(holder.image,file.getPath(), Utils.dp2px(mContext,85f),Utils.dp2px(mContext,80f));
}
}
} else if (PreferencesUtil.getKeyViewType() == 2) {//小图标
if (file.getName().toLowerCase().endsWith(".vpd")) {
// holder.image.setImageResource(R.drawable.ic_vpd);
if(bitmapMap.get(R.drawable.ic_vpd) == null){
bitmapMap.put(R.drawable.ic_vpd, BitmapFactory.decodeResource(activity.getResources(), R.drawable.ic_vpd));
}
holder.image.setImageBitmap(bitmapMap.get(R.drawable.ic_vpd));
} else {
if (mIsGridViewIdle) {
holder.image.setTag(file.getPath());
//mImageLoader.loadImage(holder.image,file.getPath(),60,50);
setListImage(holder.image,file.getPath(),60,50);
}
}
} else {//列表
// holder.image.setImageResource(R.drawable.ic_picture_list);
if(bitmapMap.get(R.drawable.ic_picture_list) == null){
bitmapMap.put(R.drawable.ic_picture_list, BitmapFactory.decodeResource(activity.getResources(), R.drawable.ic_picture_list));
}
holder.image.setImageBitmap(bitmapMap.get(R.drawable.ic_picture_list));
}
} else {
// holder.image.setImageResource(FileUtil.fileType2ResId(fileType, PreferencesUtil.getKeyViewType()));
// Glide.with(mContext).load(FileUtil.fileType2ResId(fileType, PreferencesUtil.getKeyViewType())).into(holder.image);
if(bitmapMap.get(FileUtil.fileType2ResId(fileType, PreferencesUtil.getKeyViewType())) == null){
bitmapMap.put(FileUtil.fileType2ResId(fileType, PreferencesUtil.getKeyViewType()), BitmapFactory.decodeResource(activity.getResources(), FileUtil.fileType2ResId(fileType, PreferencesUtil.getKeyViewType())));
}
holder.image.setImageBitmap(bitmapMap.get(FileUtil.fileType2ResId(fileType, PreferencesUtil.getKeyViewType())));
}
}
加载是分段加载的,每次加载30条数据,下拉继续加载,本来文件名过长想用跑马灯显示的,这反而导致了不断让RecyclerView去刷新 不断去跑OnCreateHolder()方法,导致很卡,所以删掉了TextView android:ellipsize="marquee"属性.
调用打开部分代码
/**
* 图片用自带软件打开
* @param context 上下文
* @param file 文件对象
* @param list 图片列表
*/
public static void openPicture(Context context, XZFile file, List<XZFile> list) {
try {
EventBus.getDefault().postSticky(list);
Intent intent = new Intent(context, BrowseImageActivity.class);
intent.putExtra("image_index", file.getPath());
context.startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
Utils.showToast(context, R.string.no_app_can_open);
}
}
用Viewpager写的图片浏览器 方便左右切换 旋转图片
/**
* 音乐用自带软件打开
* @param context 上下文
* @param file 文件对象
*/
private static void openAudio(Context context, XZFile file) {
Uri uri = null;
Intent intent = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//Android7.0后intent不能直接传路径
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
uri = Uri.fromFile(file.getFile());
intent = new Intent("android.intent.action.VIEW");
} else{
uri = Uri.fromFile(file.getFile());
intent = new Intent("android.intent.action.VIEW");
ComponentName componentName = new ComponentName("com.jrm.localmm", "com.jrm.localmm.ui.music.MusicPlayerActivity");
intent.setComponent(componentName);
}
intent.setDataAndType(uri, "audio");
context.startActivity(intent);
}
/**
* 视频用自带软件打开
* @param context 上下文
* @param file 文件对象
*/
private static void openVideo(Context context, XZFile file) {
Uri uri = null;
Intent intent = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
uri = Uri.fromFile(file.getFile());
intent = new Intent("android.intent.action.VIEW");
intent.setClassName("com.hisilicon.android.videoplayer",
"com.hisilicon.android.videoplayer.activity.VideoActivity");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
} else{
uri = Uri.fromFile(file.getFile());
intent = new Intent("android.intent.action.VIEW");
}
intent.setDataAndType(uri, "video/*");
context.startActivity(intent);
}
主要是兼容不同平台 Mstar方案 海思方案
第一次写,写得不好QAQ
网友评论