package com.whale.nangua.pumpkinfilemanager.adapter;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toast;
import com.whale.nangua.pumpkinfilemanager.R;
import com.whale.nangua.pumpkinfilemanager.view.RenameFileDialog;
import com.whale.nangua.pumpkinfilemanager.utils.FileSortFactory;
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
/**
* Created by nangua on 2016/5/27.
*/
public class FileAdapter extends BaseAdapter {
ArrayList<File> filedata;
Context context;
//排序方法
int sortWay = FileSortFactory.SORT_BY_FOLDER_AND_NAME;
public void setSortWay(int sortWay) {
this.sortWay = sortWay;
}
public FileAdapter(Context context, ArrayList<File> data) {
this.context = context;
this.filedata = data;
fileItemListener = new FileListItemListender();
}
public File[] setfiledata(ArrayList<File> data) {
this.filedata = data;
sort();
this.notifyDataSetChanged();
File[] files = new File[filedata.size()];
for (int i = 0;i<files.length;i++) {
files[i] = filedata.get(i);
}
return files;
}
public File[] setfiledata() {
File[] files = new File[filedata.size()];
for (int i = 0;i<files.length;i++) {
files[i] = filedata.get(i);
}
return files;
}
/**
* 将文件列表排序
*/
private void sort() {
Collections.sort(this.filedata, FileSortFactory.getWebFileQueryMethod(sortWay));
}
@Override
public void notifyDataSetChanged() {
//重新排序
sort();
super.notifyDataSetChanged();
}
@Override
public int getCount() {
return filedata.size();
}
@Override
public Object getItem(int position) {
return filedata.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
/**
* ibButton点击监听器
*/
FileListItemListender fileItemListener;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
File file = filedata.get(position);
fileItemListener = new FileListItemListender();
ViewHolder viewHolder;
if (convertView == null) {
convertView =LayoutInflater.from(context).inflate(R.layout.list_file_cell, null);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
if (file.isDirectory()) {
viewHolder.fileImage.setImageResource(R.drawable.folder);
viewHolder.fileSize.setText("文件夹");
} else {
viewHolder.fileImage.setImageResource(R.drawable.file);
viewHolder.fileSize.setText(generateSize(file));
}
//将position与ibMore绑定
viewHolder.filemore.setTag(position);
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
viewHolder.fileName.setText(file.getName());
viewHolder.fileTime.setText(format.format(new Date(file.lastModified())));
viewHolder.filemore.setOnClickListener(fileItemListener);
return convertView;
}
public static String generateSize(File file) {
if (file.isFile()) {
long result = file.length();
long gb = 2 << 29;
long mb = 2 << 19;
long kb = 2 << 9;
if (result < kb) {
return result + "B";
} else if (result >= kb && result < mb) {
return String.format("%.2fKB", result / (double) kb);
} else if (result >= mb && result < gb) {
return String.format("%.2fMB", result / (double) mb);
} else if (result >= gb) {
return String.format("%.2fGB", result / (double) gb);
}
}
return null;
}
public static class ViewHolder {
ImageView fileImage;
TextView fileName;
TextView fileSize;
TextView fileTime;
ImageButton filemore;
public ViewHolder(View v) {
fileImage = (ImageView) v.findViewById(R.id.file_image);
fileName = (TextView) v.findViewById(R.id.file_name);
fileSize = (TextView) v.findViewById(R.id.file_size);
fileTime = (TextView) v.findViewById(R.id.file_time);
filemore = (ImageButton) v.findViewById(R.id.file_more);
}
}
/**
* ibMore被点击的监听器
* 点击的时候图标旋转并弹出menu,根据点击的view获取其绑定的position,之后再在file集合中操作数据
*/
public class FileListItemListender implements View.OnClickListener, PopupMenu.OnMenuItemClickListener {
Integer position;
@Override
public void onClick(final View v) {
//获取view中绑定的tag
position = (Integer) v.getTag();
//创建菜单
PopupMenu popupMenu = new PopupMenu(context, v);
//加载布局
popupMenu.inflate(R.menu.file_list_popup_menu);
//设置消失时的监听器
popupMenu.setOnDismissListener(new PopupMenu.OnDismissListener() {
@Override
public void onDismiss(PopupMenu menu) {
//旋转动画(消失的时候会显示旋转动画)
RotateAnimation rotateAnimation = new RotateAnimation(180, 0, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
//设置动画时间300ms
rotateAnimation.setDuration(200);
//设置动画保留状态
rotateAnimation.setFillAfter(true);
v.startAnimation(rotateAnimation);
}
});
popupMenu.setOnMenuItemClickListener(this);
if (filedata.get(position).isDirectory()){
popupMenu.getMenu().findItem(R.id.more_copy).setVisible(false);
}else {
popupMenu.getMenu().findItem(R.id.more_copy).setVisible(true);
}
RotateAnimation rotateAnimation = new RotateAnimation(0, 180, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rotateAnimation.setDuration(200);
rotateAnimation.setFillAfter(true);
v.startAnimation(rotateAnimation);
popupMenu.show();
}
/**
* 菜单项点击
*
* @param item
* @return true 事件处理完毕 false
*/
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.more_rename:
doRename();
break;
case R.id.more_copy:
doCopy();
break;
case R.id.more_remove:
doRemove();
break;
default:
break;
}
return true;
}
/**
* 删除
*/
private void doRemove() {
final File file = filedata.get(position);
judgeAlertDialog(context, "提醒", "你确认删除" + file.getName() + "吗(不可逆)?", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
deleteDir(file);
filedata.remove(file);
notifyDataSetChanged();
showToast(file.getName() + " 删除成功");
}
}, null);
}
/**
* 显示消息
*
* @param message
*/
private void showToast(String message) {
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
}
/**
* 复制
*/
private void doCopy() {
if (onCopyFileListener!=null) {
onCopyFileListener.doCopy(filedata.get(position));
}
}
/**
* 重命名
*/
private void doRename() {
showToast("重命名" + position);
RenameFileDialog dialog = new RenameFileDialog(context, filedata, position);
dialog.setOnFileRenameListener(new RenameFileDialog.OnFileRenameListener() {
@Override
public void onFileRenamed(boolean success) {
String message = null;
if (filedata.get(position).isFile()) {
message = "文件";
} else {
message = "文件夹";
}
if (success) {
message += "重命名成功";
} else {
message += "重命名失败";
}
showToast(message);
}
});
dialog.show();
setfiledata(filedata);
}
}
/**
* 判断对话框
* @param context
* @param title
* @param message
* @param okListener
* @param cancleListener
* @return
*/
public static AlertDialog judgeAlertDialog(Context context, String title,
String message, DialogInterface.OnClickListener okListener,
DialogInterface.OnClickListener cancleListener) {
AlertDialog aDialog = new AlertDialog.Builder(context).setTitle(title).setMessage(message)
.setNegativeButton("确定", okListener)
.setPositiveButton("取消", cancleListener).show();
return aDialog;
}
/**
* 删除文件或文件夹
* @param file
*/
public static void deleteDir(File file) {
if (file.isFile()) {
file.delete();
} else {
File[] files = file.listFiles();
for (File f : files) {
deleteDir(f);
}
}
file.delete();
}
public interface OnCopyFileListener{
void doCopy(File file);
}
OnCopyFileListener onCopyFileListener;
public void setonCopyListner(OnCopyFileListener onCopyFileListener){
this.onCopyFileListener = onCopyFileListener;
};
}
package com.whale.nangua.pumpkinfilemanager.async;
import android.os.AsyncTask;
import android.support.v7.app.AlertDialog;
import android.util.Log;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.whale.nangua.pumpkinfilemanager.adapter.FileAdapter;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
/**
* Created by nangua on 2016/5/30.
*/
public class QueryAsyncTask extends AsyncTask<Integer,Integer,ArrayList<File>> {
TextView tv;
String path;
HashMap<File, String> searchfilemap;
String query;
FileAdapter fileAdapter;
AlertDialog dialog;
public QueryAsyncTask(TextView tv,String path,String query,FileAdapter fileAdapter,AlertDialog dialog) {
this.tv = tv;
this.path = path;
this.query = query;
this.fileAdapter = fileAdapter;
this.dialog = dialog;
}
ArrayList<File> data;
@Override
protected ArrayList<File> doInBackground(Integer... params) {
int total=0;
data = new ArrayList<>();
searchfilemap = new HashMap<>();
searchByPath(path);
if (searchfilemap.size() > 0) {
//取出map中数据,赋值给data
Object[] list = searchfilemap.entrySet().toArray();
for (int i = 0; i < searchfilemap.size(); i++) {
data.add(new File(list[i].toString()));
}
}
return data;
}
@Override
protected void onPostExecute(ArrayList<File> data) {
tv.setText("扫描完成,共扫描文件:" + filenum + "个");
fileAdapter.setfiledata(data);
//
fileAdapter.notifyDataSetChanged();
}
@Override
protected void onProgressUpdate(Integer... values) {
int v = values[0];
tv.setText("已扫描文件数:" + v);
fileAdapter.notifyDataSetChanged();
}
@Override
protected void onPreExecute() {
tv.setText("开始扫描当前目录下文件");
}
int filenum = 0;
int totalnum = 0;
private void searchByPath(String path) {
File[] files = new File(path).listFiles();
filenum += files.length;
publishProgress(filenum);
for (int i = 0; i < files.length; i++) {
File f = files[i];
if (f.isDirectory()) {
searchByPath(path + "/" + f.getName());
} else {
if (f.getName().contains(query)) {
searchfilemap.put(files[i], files[i].getName());
}
}
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/main_view"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.whale.nangua.pumpkinfilemanager.MainActivity">
<TextView
android:id="@+id/showtv"
android:layout_width="match_parent"
android:layout_height="30dp"
android:background="@android:color/darker_gray"
android:gravity="center_vertical"
android:paddingLeft="10dp"/>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
></ListView>
</FrameLayout>
</LinearLayout>
list_file_cell.xml`
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants"
android:orientation="vertical">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="75dp"
android:orientation="horizontal" >
<ImageView
android:id="@+id/file_image"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_margin="10dp"
android:scaleType="fitCenter"
android:layout_gravity="center_vertical"
android:src="@drawable/file" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="4"
android:orientation="vertical"
android:padding="5dp" >
<TextView
android:id="@+id/file_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_weight="1"
android:maxLines="1"
android:text="文件名"
android:textSize="15sp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_weight="1" >
<TextView
android:id="@+id/file_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="20dp"
android:text="文件大小"
android:textColor="@color/lgray"
android:textSize="12sp" />
<TextView
android:id="@+id/file_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="创建时间"
android:textColor="@color/lgray"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
<ImageButton
android:id="@+id/file_more"
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@android:style/Widget.Holo.Button.Borderless"
android:src="@drawable/ic_arrow_drop_down_24dp"
/>
</LinearLayout>
</LinearLayout>
newfloder_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="300dp"
android:orientation="vertical"
android:layout_height="150dp" >
<!-- Line 1 -->
<TextView
android:id="@+id/imageView_background_mydialog"
android:text="新建文件夹"
android:textSize="20sp"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@android:color/darker_gray"></TextView>
<!-- Line 2 -->
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:src="@drawable/folder"/>
<requestFocus />
<EditText
android:id="@+id/newfloder_name"
android:layout_width="0dp"
android:layout_weight="1"
android:focusableInTouchMode="true"
android:layout_height="match_parent"/>
</LinearLayout>
<!-- Line 3 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:padding="10dp"
android:layout_weight="2"
android:orientation="horizontal">
<Button
android:id="@+id/newfloder_cancle"
android:text="取消"
android:layout_margin="5dp"
android:layout_width="0dp"
android:layout_weight="1"
android:background="@android:color/darker_gray"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/newfloder_create"
android:layout_margin="5dp"
android:text="创建"
android:layout_width="0dp"
android:layout_weight="1"
android:background="@android:color/holo_blue_dark"
android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout>
query_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="300dp"
android:orientation="vertical"
android:layout_height="150dp" >
<!-- Line 1 -->
<TextView
android:text="···查询中···"
android:textSize="20sp"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@android:color/darker_gray"></TextView>
<!-- Line 2 -->
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:layout_height="0dp"
android:layout_weight="2">
<ProgressBar
android:layout_gravity="center"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"/>
</LinearLayout>
<!-- Line 3 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:padding="10dp"
android:layout_weight="2"
android:orientation="horizontal">
<TextView
android:id="@+id/query_tv"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
</LinearLayout>