android遍历文件和预览文件

适配器布局文件file_item

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/ll_file_item_root"
              android:orientation="horizontal"
              android:layout_width="match_parent"
              android:layout_height="50dp">
    <ImageView
        android:id="@+id/item_imageview"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginLeft="10dp"
        android:src="@mipmap/fold"
        android:scaleType="fitXY"
        />

    <TextView
        android:id="@+id/item_textview"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginLeft="10dp"
        android:text="TextView"
        android:gravity="center"
        />

</LinearLayout> 

适配器FileAdapter

package com.yann.yanndemo.adapter;

import android.support.annotation.LayoutRes;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.yann.yanndemo.R;
import com.yann.yanndemo.entity.FileEntity;

/**
 * Created by wyy on 2018/2/27.
 */

public class FileAdapter extends BaseQuickAdapter<FileEntity, BaseViewHolder> {

    private static final String TAG = DialogSelectorAdapter.class.getSimpleName();
    private OnItemClickListener mOnItemClickListener;
    public FileAdapter(@LayoutRes int layoutResId) {
        super(layoutResId);
    }

    public void setOnBranchItemClickListener(OnItemClickListener onItemClickListener) {
        mOnItemClickListener = onItemClickListener;
    }

    @Override
    protected void convert(BaseViewHolder helper, FileEntity item, final int position) {
        LinearLayout rootView = helper.getView(R.id.ll_file_item_root);
        ImageView iv = helper.getView(R.id.item_imageview);
        TextView tv = helper.getView(R.id.item_textview);
        rootView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mOnItemClickListener.onItemClick(position);
            }
        });
        int type = getItemViewType(position);
        switch (type) {
            case 0:
                iv.setImageResource(R.mipmap.fold);
                tv.setText(item.getFileName());
                break;
            case 1:
                iv.setImageResource(R.mipmap.file);
                tv.setText(item.getFileName());
                break;
            default:
                break;
        }
    }

    @Override
    public int getItemViewType(int position) {
        if(mData.get(position).getFileType() == FileEntity.Type.FLODER){
            return 0;
        }else{
            return 1;
        }
    }

    public interface OnItemClickListener {
        void onItemClick(int position);
    }
}

file实体类FileEntity

package com.yann.yanndemo.entity;

/**
 * Created by wyy on 2018/2/27.
 */

public class FileEntity {

    public enum Type{
        FLODER,FILE
    }
    private String filePath;
    private String fileName;
    private String fileSize;
    private Type fileType;


    public String getFilePath() {
        return filePath;
    }
    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }
    public String getFileName() {
        return fileName;
    }
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
    public String getFileSize() {
        return fileSize;
    }
    public void setFileSize(String fileSize) {
        this.fileSize = fileSize;
    }
    public Type getFileType() {
        return fileType;
    }
    public void setFileType(Type fileType) {
        this.fileType = fileType;
    }
}

根据名称排序类FileComparator

package com.yann.yanndemo.utils;

import com.yann.yanndemo.entity.FileEntity;

import java.util.Comparator;

/**
 * Created by wyy on 2018/3/3.
 */

public class FileComparator implements Comparator<FileEntity> {
    @Override
    public int compare(FileEntity o1, FileEntity o2) {
        return o1.getFileName().toLowerCase().compareTo(o2.getFileName().toLowerCase());
    }
}

activity代码FileListActivity

package com.yann.yanndemo.ui.file;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.OrientationHelper;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.chad.library.adapter.base.helper.RecyclerViewHelper;
import com.yann.yanndemo.R;
import com.yann.yanndemo.adapter.FileAdapter;
import com.yann.yanndemo.entity.FileEntity;
import com.yann.yanndemo.ui.showimg.ShowImageActivity;
import com.yann.yanndemo.utils.FileComparator;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;

public class FileListActivity extends Activity implements FileAdapter.OnItemClickListener {
    private static final String TAG = FileListActivity.class.getSimpleName();
    private FileAdapter mFileAdapter;
    private RecyclerView rv_file_list;
    private File currentFile;
    private String sdRootPath;
    private ArrayList<FileEntity> mList;
    private int[] ab = new int[2];
    private LinearLayoutManager linearLayoutManager;
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 1:
                    mFileAdapter.setNewData(mList);
                    LinearLayoutManager linearLayoutManagers = (LinearLayoutManager) rv_file_list.getLayoutManager();
                    linearLayoutManagers.scrollToPositionWithOffset(ab[0], ab[1]);
                    break;
                case 2:

                    break;

                default:
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_file_list);

        mList = new ArrayList<>();
        sdRootPath = Environment.getExternalStorageDirectory().getAbsolutePath();
        currentFile = new File(sdRootPath);

        rv_file_list = (RecyclerView) findViewById(R.id.rv_file_list);

        mFileAdapter = new FileAdapter(R.layout.file_item);
        mFileAdapter.setOnBranchItemClickListener(this);
        RecyclerViewHelper.initRecyclerViewV(this, rv_file_list, true, mFileAdapter);
        linearLayoutManager = (LinearLayoutManager) rv_file_list.getLayoutManager();
        Log.d(TAG, "sdRootPath:" + sdRootPath);
        getData(sdRootPath);
    }

    @Override
    public void onBackPressed() {
        Log.d(TAG, "onBackPressed");
//        if (sdRootPath.equals(currentFile.getAbsolutePath())) {
        if (sdRootPath.equals(Environment.getExternalStorageDirectory().getAbsolutePath())) {
            Log.d(TAG, "已经到了根目录");
            finish();
            return;
        }

        String parentPath = currentFile.getParent();
        sdRootPath = parentPath;
        currentFile = new File(parentPath);
        getData(parentPath);
    }

    private void getData(final String path) {
        new Thread() {
            @Override
            public void run() {
                super.run();
                findAllFiles(path);
            }
        }.start();

    }


    /**
     * 查找path地址下所有文件
     *
     * @param path
     */
    public void findAllFiles(String path) {
        mList.clear();

        if (path == null || path.equals("")) {
            return;
        }
        File fatherFile = new File(path);
        if (fatherFile.exists()) {
            Log.d(TAG, "文件存在");
            File[] files = fatherFile.listFiles();
            Log.d(TAG, "files.length:" + files.length);
            if (files.length > 0) {
                ArrayList<FileEntity> mFileEntitys = new ArrayList<>();
                for (int i = 0; i < files.length; i++) {
                    if (!files[i].getName().toString().startsWith(".")) {
                        FileEntity entity = new FileEntity();
                        boolean isDirectory = files[i].isDirectory();

                        entity.setFileName(files[i].getName().toString());
                        entity.setFilePath(files[i].getAbsolutePath());
                        entity.setFileSize(files[i].length() + "");
                        if (isDirectory == true) {
                            entity.setFileType(FileEntity.Type.FLODER);
                            mList.add(entity);
                        } else {
                            entity.setFileType(FileEntity.Type.FILE);
                            mFileEntitys.add(entity);
                        }

                    }

                }
                if (!mFileEntitys.isEmpty()) {
                    Collections.sort(mFileEntitys,new FileComparator());
                }
                if (!mList.isEmpty()) {
                    Collections.sort(mList,new FileComparator());
                }
                mList.addAll(mFileEntitys);
            }

            Log.d(TAG, "mList.size():" + mList.size());
            mHandler.sendEmptyMessage(1);
        } else {
            Log.d(TAG, "文件不存在");
        }

    }

    @Override
    public void onItemClick(int position) {
        Log.d(TAG, "onItemClick");
        Log.d(TAG, "mList.get(position).getFileName():" + mList.get(position).getFileName());
        String temp = sdRootPath + File.separator + mList.get(position).getFileName();
        String fileName = mList.get(position).getFileName();
        Log.d(TAG, "temp:" + temp);
        File file = new File(temp);
        if (file.isDirectory()) {
            ab = getRecyclerViewLastPosition(linearLayoutManager, mList);
            sdRootPath = temp;
            Log.d(TAG, "sdRootPath:" + sdRootPath);
            currentFile = new File(sdRootPath);
            getData(sdRootPath);
        } else {
            //点击的文件,你可以在这里写一些代码,预览图片或者调用其它应用打开文件
            Toast.makeText(this, "您选择了:" + mList.get(position).getFileName() + "文件", Toast.LENGTH_LONG).show();
        }

    }

    //获得RecyclerView滑动的位置
    private int[] getRecyclerViewLastPosition(LinearLayoutManager layoutManager, ArrayList<FileEntity> mList) {
        int[] pos = new int[2];
        pos[0] = layoutManager.findFirstCompletelyVisibleItemPosition();
        OrientationHelper orientationHelper = OrientationHelper.createOrientationHelper(layoutManager, OrientationHelper.VERTICAL);
        int fromIndex = 0;
        int toIndex = mList.size();
        final int start = orientationHelper.getStartAfterPadding();
        final int end = orientationHelper.getEndAfterPadding();
        final int next = toIndex > fromIndex ? 1 : -1;
        for (int i = fromIndex; i != toIndex; i += next) {
            final View child = rv_file_list.getChildAt(i);
            final int childStart = orientationHelper.getDecoratedStart(child);
            final int childEnd = orientationHelper.getDecoratedEnd(child);
            if (childStart < end && childEnd > start) {
                if (childStart >= start && childEnd <= end) {
                    pos[1] = childStart;
                    Log.d(TAG, "position = " + pos[0] + " off = " + pos[1]);
                    return pos;
                }
            }
        }
        return pos;
    }
}

activity的资源文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.yann.yanndemo.ui.file.FileListActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_file_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

猜你喜欢

转载自blog.csdn.net/yann02/article/details/79434507