第一步:主界面布局文件,只需要定义一个button和listview即可,
<Button android:id="@+id/bt_select" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="本地文件" android:background="@drawable/btn"/> <LinearLayout android:id="@+id/ll_return" android:layout_width="match_parent" android:layout_height="40dp" android:layout_marginTop="5dp" android:orientation="vertical"> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/weakRed" android:layout_marginTop="3dp"></View> <ImageView android:id="@+id/iv_return" android:layout_width="30dp" android:layout_height="30dp" android:layout_marginLeft="10dp" android:src="@drawable/fanhui" android:layout_gravity="center_vertical"/> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/weakRed" android:layout_marginTop="3dp"></View> </LinearLayout> <ListView android:id="@+id/lv_show" android:layout_width="match_parent" android:layout_height="match_parent" ></ListView>
自定义listview的布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <ImageView android:id="@+id/iv_show" android:layout_width="35dp" android:layout_height="35dp" android:layout_gravity="center" android:layout_marginLeft="5dp"/> <TextView android:id="@+id/tv_show" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginLeft="10dp" android:textSize="17sp"/> </LinearLayout>
第二步:Android6.0以上需要动态申请权限,
(1)AndroidManifest.xml配置文件中,添加以下权限,
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />(2)在项目的build.gradle中添加依赖:
implementation 'com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar'
(3)代码中创建对象
private RxPermissions mRxPermissions;
mRxPermissions=new RxPermissions(this);
mRxPermissions.request(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION , Manifest.permission.CAMERA) .subscribe(new Action1<Boolean>() { @Override public void call(Boolean aBoolean) { if(!aBoolean){//授予权限 }else {禁止权限 } } });
第三步:自定义工具类MainUtils,代码得到本地根目录下所有文件及文件夹的集合
/** * 递归遍历出目录下面所有文件 * @param pathName 需要遍历的目录,必须以"/"开始和结束 * @throws IOException */ public List<String>filelist; private List<Const>constList; private List<String>memoryList=new ArrayList<>();//记录上一次的所有文件路径,当下一级目录有数据时,再赋值给它,如果没有,保留上一次数据,防止为空时,路径异常 public List<String> List(String pathName) throws IOException{ filelist=new ArrayList<>(); constList=new ArrayList<>(); if(pathName.startsWith("/")&&pathName.endsWith("/")){ final String directory = pathName; //更换目录到当前目录 File[] files = new File(directory).listFiles(); for(File file:files){ if(file.isFile()){ filelist.add(directory+file.getName()); Const con=new Const(); con.setImg(R.drawable.wenjian); con.setText(file.getName()); constList.add(con); }else if(file.isDirectory()){ filelist.add(directory+file.getName()+"/"); Const con=new Const(); con.setImg(R.drawable.wenjianja); con.setText(file.getName()); constList.add(con); } } } if(filelist.size()>0){ memoryList.clear(); memoryList.addAll(filelist); } return memoryList; }
将得到的数据集合展示到界面
public void select(String Npath){ try { path=Npath; stringList=List(path,OnItem.getOneItem().getTemp()); arrayAdapter=new Showadapter(context,constList); lv_show.setAdapter(arrayAdapter); } catch (IOException e) { Log.e("异常:",e.getMessage().toString()); } }
listview的点击事件
public void lvItemClick(){ lv_show.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { try { if(OnItem.getOneItem().getTemp()==2){ if(stringList.size()>0){ if(!new File(stringList.get(i)).isFile()){ path=stringList.get(i); stringList=List(stringList.get(i),2); if(stringList.size()>0){ arrayAdapter=new Showadapter(context,constList); lv_show.setAdapter(arrayAdapter); arrayAdapter.notifyDataSetChanged(); } }else { openFile.openFile(stringList.get(i)); } } } } catch (IOException e) { Log.e("异常:",e.getMessage().toString()); } } }); }
第四步:MainActivity中调用工具类中的方法
case R.id.bt_select://本地文件 attemptPermissions(); mainUtils.lvItemClick(); ll_return.setVisibility(View.VISIBLE); mainUtils.select(Environment.getExternalStorageDirectory()+"/"); break;
最后,效果图,完整的源码中包含FTP服务器上文件管理和本地文件上传至服务器的功能,可以自己调用点击打开链接
完整代码下载链接
https://download.csdn.net/download/u011897782/10418123