美文网首页Android开发经验谈Android知识
安卓文件夹路径选择功能实现

安卓文件夹路径选择功能实现

作者: 极客简讯 | 来源:发表于2017-11-29 10:53 被阅读136次

    开发环境:Android Studio
    库文件下载:compile 'li.filechoose:FileDirChoose:1.0.3'(可以看一下Android Studio3.0 关键字 compile 和 implementation 的区别,有坑)
    github地址:https://github.com/zw21544182/RecordDemo(filechoose)
    关键知识:RecyclerView.Adapter的使用
    最终效果:

    效果.gif

    界面代码比较简单,就不贴了
    先来看看初始化权限

     private void initData() {
            if (Build.VERSION.SDK_INT >= 23) {//判断系统版本是否大于6.0
                if (checkSelfPermission(NEED_PERMISSION) == PackageManager.PERMISSION_GRANTED) {
                    //检查是否有读写权限
                    loadDataFrompATH(mPath);//从路径中加载数据 
                } else {
                    requestPermissions(new String[]{NEED_PERMISSION}, REQUESCODE);//申请权限
                }
                return;
            }
            loadDataFrompATH(mPath);//系统版本小于6.0直接加载数据
        }
    

    接下来是加载数据方法

    private void loadDataFrompATH(final String mPath) {
            data.clear();//data为RecyclerView中要显示的数据
            new Thread() {
                public void run() {
                    super.run();
                    File file = new File(mPath);
                    File[] listFiles = file.listFiles();//获取子文件
                    for (File f : listFiles
                            ) {
                        if (!f.isDirectory() || f.getName().startsWith(".")) {//如果不是路径或者以 . 开头的文件夹 则直接跳过
                            continue;
                        }
                        data.add(f.getAbsolutePath());//往集合中添加符合条件的数据
                    }
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            fileAdapter.setData(data);//将数据载入适配器当中
                        }
                    });
                }
            }.start();
    
        }
    

    重点来了

    适配器FileAdapter的onBindViewHolder方法

        @Override
        public void onBindViewHolder(final ViewHolder holder, final int position) {
            final String path = data.get(position);
            boolean isChecked = false;//初始化一个boolean值 来判断是否被选中
            for (String s : selectData
                    ) {//遍历选中的集合
                if (s.trim().equals(path)) {//如果集合中的子元素与适配其中的路径相同
                    isChecked = true;//判断已被选中
                    break;//终止循环
                }
            }
            holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton compoundButton, boolean b) {//设置checkBox的点击事件
                    if (b) {//选中状态
                        if (selectData.contains(path))//如果集合中包含了该元素则直接返回
                            return;
                        else//否则添加
                            selectData.add(path);
                    } else {//未选中状态
                        if (selectData.contains(path))//如果集合中包含了该元素则移除
                            selectData.remove(path);
                        else//否则 返回
                            return;
                    }
                }
            });
            holder.checkBox.setChecked(isChecked);
            holder.tvFileDir.setText(path.substring(path.lastIndexOf("/") + 1));
            holder.rootLayout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (!holder.checkBox.isChecked()) //获取checkBox的选中状态来判断是否能进入下一个文件夹
                    {
                        event.enterNextDir(data.get(position));//接口,用于在activity中回调
                    } else {
                        Toast.makeText(context, context.getString(R.string.filechoose_already), Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }
    

    最后看看ativity中的回调方法

      fileAdapter.setEvent(new FileAdapter.Event() {
                @Override
                public void enterNextDir(String path) {
                    editText.setText("");
                    mPath = path;//将子路径赋值给当前路径
                    loadDataFrompATH(mPath);//加载数据
                }
            });
    

    相关文章

      网友评论

        本文标题:安卓文件夹路径选择功能实现

        本文链接:https://www.haomeiwen.com/subject/cequbxtx.html