開發(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的使用
最終效果:
界面代碼比較簡單,就不貼了
先來看看初始化權(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ù)
}
});