安卓开发1.2

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值