封装一个View做文件夹管理器
2016-04-21 18:45
399 查看
其实只是一个组合的View,没太多技术可言。。。
效果:
![](https://img-blog.csdn.net/20160421184240678)
详细代码:
这里面还有个Dialog的布局文件
这样直接放在布局文件里面使用就行了。
效果:
详细代码:
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>
这样直接放在布局文件里面使用就行了。
相关文章推荐
- android studio 导入eclipse项目 之中文乱码
- Oracle内置表一
- log4j config
- 机器学习之——逻辑回归
- OpenCV2应用Meanshift查找相似物体
- Maven 在sts不会自动下载包的问题
- 随机产生多个JCheckBox,并在选择是时。获取jcheckbox的文本
- Flume集群搭建
- Apache Ranger0.6版本源码编译
- 周总结
- iOS 自带定位功能CoreLocation
- PHP CI分页类带多个参数
- swing的文本域滚动条总是显示
- iOS中解析 XML / JSON格式讲解
- 图解VMWare10创建虚拟机
- UIWebView - 使用方法总结
- 高性能Javascript笔记
- HDU 1501 Zipper (DFS+剪枝做法)
- linux管道(pipe)
- 测试与开发的关系