适配器布局文件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>