您的位置:首页 > 其它

封装一个View做文件夹管理器

2016-04-21 18:45 399 查看
其实只是一个组合的View,没太多技术可言。。。

效果:



详细代码:

public class DirectoryListView extends RelativeLayout{

private Button mLast,mConfirm,mMkdir;
private ListView mListView;

private String parentPath,curPath;
private LinkedList<String> curFiles;

private MyAdapter adapter;

public DirectoryListView(Context context) {
this(context, null, 0);
}

public DirectoryListView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public DirectoryListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//检查SD卡写入权限是否开启,也可以在此之前检查是否有SD卡,我省略了
PackageManager pm = context.getPackageManager();
if (PackageManager.PERMISSION_GRANTED != pm.checkPermission("android.permission.WRITE_EXTERNAL_STORAGE", context.getPackageName())){
Toast.makeText(getContext(),"权限未开启",Toast.LENGTH_LONG).show();
return;
}else {
Toast.makeText(getContext(),"权限已开启",Toast.LENGTH_LONG).show();
}

addView(context);
initListView();
initButton();
}

/*
* 不想用布局文件就直接java代码添加一下
*/
private void addView(Context context){
mLast = new Button(context);
mConfirm = new Button(context);
mMkdir = new Button(context);
mListView = new ListView(context);
LinearLayout bottomLinear = new LinearLayout(context);

LayoutParams lp1 = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,dpToPx(50));
LayoutParams lp2 = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
LayoutParams lp3 = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,dpToPx(50));

addView(mLast,lp1);

lp2.topMargin = dpToPx(50);
lp2.bottomMargin = dpToPx(50);
addView(mListView, lp2);

lp3.addRule(ALIGN_PARENT_BOTTOM);
bottomLinear.setOrientation(LinearLayout.HORIZONTAL);
LinearLayout.LayoutParams lllp = new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT,1);
bottomLinear.addView(mMkdir, lllp);
bottomLinear.addView(mConfirm, lllp);
addView(bottomLinear, lp3);

mLast.setText("向上");
mConfirm.setText("确定为当前目录");
mMkdir.setText("新建文件夹");
}

/*
*  初始化列表
*/
private void initListView(){
if (curFiles == null){
curFiles = new LinkedList<>();
}
curPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath();
File curFile = new File(curPath);
parentPath = curFile.getParentFile().getPath();
File[] files = curFile.listFiles();
for (File file:files){
if (file.isDirectory()) {
curFiles.add(file.getName());
}
}
adapter = new MyAdapter();
mListView.setAdapter(adapter);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (!mLast.isEnabled()){
mLast.setEnabled(true);
}
String clickPath = curFiles.get(position);
parentPath = curPath;
curPath = curPath + "/" + clickPath;
curFiles.clear();
File[] files = new File(curPath).listFiles();
for (File file : files) {
if (file.isDirectory()) {
curFiles.add(file.getName());
}
}
adapter.notifyDataSetChanged();
}
});
}

/*
*  初始化几个按键
*/
private void initButton(){
mLast.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
File curFile = new File(parentPath);
File[] files = curFile.listFiles();
curFiles.clear();
for (File file : files) {
if (file.isDirectory()) {
curFiles.add(file.getName());
}
}
curPath = parentPath;
String parentFile = curFile.getParentFile().getPath();
if ("/".equals(parentFile)) {
mLast.setEnabled(false);
curFiles.clear();
curFiles.add("sdcard0");
curFiles.add("extSdCard");
} else {
parentPath = curFile.getParentFile().getPath();
}
adapter.notifyDataSetChanged();
}
});

mConfirm.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (onConfirmListener!=null) {
onConfirmListener.confirm(curPath);
}
}
});

mMkdir.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
View view = LayoutInflater.from(getContext()).inflate(R.layout.dialog_mkdirs,null);
final Dialog dialog = new Dialog(getContext());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setCancelable(true);
dialog.setContentView(view);
dialog.show();

final EditText et = (EditText) view.findViewById(R.id.mkdirs_et);

view.findViewById(R.id.mkdirs_confirm).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String name = et.getText().toString();
if (TextUtils.isEmpty(name)){
Toast.makeText(getContext(),"文件夹名不能为空",Toast.LENGTH_LONG).show();
}else {
File newFile = new File(curPath,name);
if (newFile.exists()){
Toast.makeText(getContext(),"该文件夹已存在",Toast.LENGTH_LONG).show();
}else {
newFile.mkdir();
curFiles.addFirst(name);
adapter.notifyDataSetChanged();
dialog.dismiss();
}
}
}
});
}
});
}

/**
* 自定义的Adapter
*/
class MyAdapter extends BaseAdapter {

@Override
public int getCount() {
return curFiles.size();
}

@Override
public Object getItem(int position) {
return null;
}

@Override
public long getItemId(int position) {
return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView tv = new TextView(parent.getContext());
tv.setPadding(30, 30, 30, 30);
tv.setText(position+"------ "+curFiles.get(position));
return tv;
}
}

private OnConfirmListener onConfirmListener;

/**
* 开放确定文件夹接口,其实只是我自己的项目需要。。。
* @param onConfirmListener
*/
public void setOnConfirmListener(OnConfirmListener onConfirmListener) {
this.onConfirmListener = onConfirmListener;
}

public interface OnConfirmListener{
void confirm(String path);
}

private int dpToPx(int dp){
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dp,getResources().getDisplayMetrics());
}
}


这里面还有个Dialog的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
android:textSize="18sp"
android:padding="20dp"
android:text="新建文件夹"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<View
android:background="#cccccc"
android:layout_width="match_parent"
android:layout_height="1dp"/>
<EditText
android:id="@+id/mkdirs_et"
android:textSize="16sp"
android:hint="输入文件夹名称"
android:layout_margin="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<View
android:background="#cccccc"
android:layout_width="match_parent"
android:layout_height="1dp"/>
<Button
android:id="@+id/mkdirs_confirm"
android:text="确定"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>


这样直接放在布局文件里面使用就行了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: