安卓文件夾路徑選擇功能實(shí)現(xiàn)

開發(fā)環(huán)境:Android Studio
庫文件下載:compile 'li.filechoose:FileDirChoose:1.0.3'(可以看一下Android Studio3.0 關(guān)鍵字 compile 和 implementation 的區(qū)別,有坑)
github地址:https://github.com/zw21544182/RecordDemo(filechoose)
關(guān)鍵知識(shí):RecyclerView.Adapter的使用
最終效果:

效果.gif

界面代碼比較簡單,就不貼了
先來看看初始化權(quán)限

 private void initData() {
        if (Build.VERSION.SDK_INT >= 23) {//判斷系統(tǒng)版本是否大于6.0
            if (checkSelfPermission(NEED_PERMISSION) == PackageManager.PERMISSION_GRANTED) {
                //檢查是否有讀寫權(quán)限
                loadDataFrompATH(mPath);//從路徑中加載數(shù)據(jù) 
            } else {
                requestPermissions(new String[]{NEED_PERMISSION}, REQUESCODE);//申請(qǐng)權(quán)限
            }
            return;
        }
        loadDataFrompATH(mPath);//系統(tǒng)版本小于6.0直接加載數(shù)據(jù)
    }

接下來是加載數(shù)據(jù)方法

private void loadDataFrompATH(final String mPath) {
        data.clear();//data為RecyclerView中要顯示的數(shù)據(jù)
        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());//往集合中添加符合條件的數(shù)據(jù)
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        fileAdapter.setData(data);//將數(shù)據(jù)載入適配器當(dāng)中
                    }
                });
            }
        }.start();

    }

重點(diǎn)來了

適配器FileAdapter的onBindViewHolder方法

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
        final String path = data.get(position);
        boolean isChecked = false;//初始化一個(gè)boolean值 來判斷是否被選中
        for (String s : selectData
                ) {//遍歷選中的集合
            if (s.trim().equals(path)) {//如果集合中的子元素與適配其中的路徑相同
                isChecked = true;//判斷已被選中
                break;//終止循環(huán)
            }
        }
        holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {//設(shè)置checkBox的點(diǎn)擊事件
                if (b) {//選中狀態(tài)
                    if (selectData.contains(path))//如果集合中包含了該元素則直接返回
                        return;
                    else//否則添加
                        selectData.add(path);
                } else {//未選中狀態(tài)
                    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的選中狀態(tài)來判斷是否能進(jìn)入下一個(gè)文件夾
                {
                    event.enterNextDir(data.get(position));//接口咕村,用于在activity中回調(diào)
                } else {
                    Toast.makeText(context, context.getString(R.string.filechoose_already), Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

最后看看ativity中的回調(diào)方法

  fileAdapter.setEvent(new FileAdapter.Event() {
            @Override
            public void enterNextDir(String path) {
                editText.setText("");
                mPath = path;//將子路徑賦值給當(dāng)前路徑
                loadDataFrompATH(mPath);//加載數(shù)據(jù)
            }
        });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钞翔,一起剝皮案震驚了整個(gè)濱河市镀岛,隨后出現(xiàn)的幾起案子饲齐,更是在濱河造成了極大的恐慌缓窜,老刑警劉巖藤违,帶你破解...
    沈念sama閱讀 212,332評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異脊岳,居然都是意外死亡逝段,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門割捅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奶躯,“玉大人,你說我怎么就攤上這事亿驾∴谇” “怎么了?”我有些...
    開封第一講書人閱讀 157,812評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵莫瞬,是天一觀的道長儡蔓。 經(jīng)常有香客問我,道長疼邀,這世上最難降的妖魔是什么浙值? 我笑而不...
    開封第一講書人閱讀 56,607評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮檩小,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烟勋。我一直安慰自己规求,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,728評(píng)論 6 386
  • 文/花漫 我一把揭開白布卵惦。 她就那樣靜靜地躺著阻肿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沮尿。 梳的紋絲不亂的頭發(fā)上丛塌,一...
    開封第一講書人閱讀 49,919評(píng)論 1 290
  • 那天较解,我揣著相機(jī)與錄音,去河邊找鬼赴邻。 笑死印衔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的姥敛。 我是一名探鬼主播奸焙,決...
    沈念sama閱讀 39,071評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼彤敛!你這毒婦竟也來了与帆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,802評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤墨榄,失蹤者是張志新(化名)和其女友劉穎玄糟,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袄秩,經(jīng)...
    沈念sama閱讀 44,256評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡阵翎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,576評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了播揪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贮喧。...
    茶點(diǎn)故事閱讀 38,712評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖猪狈,靈堂內(nèi)的尸體忽然破棺而出箱沦,到底是詐尸還是另有隱情,我是刑警寧澤雇庙,帶...
    沈念sama閱讀 34,389評(píng)論 4 332
  • 正文 年R本政府宣布谓形,位于F島的核電站,受9級(jí)特大地震影響疆前,放射性物質(zhì)發(fā)生泄漏寒跳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,032評(píng)論 3 316
  • 文/蒙蒙 一竹椒、第九天 我趴在偏房一處隱蔽的房頂上張望童太。 院中可真熱鬧,春花似錦胸完、人聲如沸书释。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爆惧。三九已至,卻和暖如春锨能,著一層夾襖步出監(jiān)牢的瞬間扯再,已是汗流浹背芍耘。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留熄阻,地道東北人斋竞。 一個(gè)月前我還...
    沈念sama閱讀 46,473評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像饺律,于是被迫代替她去往敵國和親窃页。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,606評(píng)論 2 350