android 自定義資料夾管理器
阿新 • • 發佈:2018-11-19
自定義android 資料夾管理器
由於近期專案要求,要客戶可以自己選擇資料夾路徑,試了原生的資料夾管理器太難看了,而且還必須選擇檔案才行,PS:本人菜鳥,只能找到這樣的原生方法,還請大佬勿噴,然後沒辦法就只有自己擼了,還是老規矩,先上效果圖:
總體思路
總體思路就是拿到根目錄下的資料夾列表,然後通過listView顯示出來,最上面放一個... 三點的選項,用於返回上一級,點選當前item的時候就拿到當前item的路徑,然後在獲取到它的子資料夾資料,然後顯示出來,大概就是這個邏輯,簡單吧,現在來實現它把
先寫個資料夾列表的item,也是很簡單的,就顯示當前資料夾的檔名和圖示,外加一個選中按鈕即可
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#fff" android:orientation="vertical" > <RelativeLayout android:layout_width="match_parent" android:layout_height="40dp" android:gravity="center_vertical" > <TextView android:id="@+id/txt_path" android:layout_width="wrap_content" android:layout_height="40dp" android:layout_marginLeft="70dp" android:gravity="center" android:text="path" android:textColor="#000" /> <ImageView android:id="@+id/imageView1" android:layout_width="30dp" android:layout_height="30dp" android:layout_marginLeft="20dp" android:src="@android:drawable/sym_contact_card" /> <Button android:id="@+id/btn_choose" android:layout_width="70dp" android:layout_height="30dp" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="20dp" android:background="@drawable/black_circular_background" android:text="Choose" android:textColor="#fff" android:textSize="13sp" android:textStyle="bold" /> <RelativeLayout android:id="@+id/rel_file" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginRight="100dp" > </RelativeLayout> </RelativeLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#999" /> </LinearLayout>
大概就是這個樣子的
然後在寫個介面卡 FileAdapter,拿到當前資料夾list資料,顯示出來
package com.px.smartairdatabrowser; import java.util.ArrayList; import android.app.Activity; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.RelativeLayout; import android.widget.TextView; public class FileAdapter extends BaseAdapter { private ArrayList<String> fileLists; private LayoutInflater mInflator; private Activity mContext; private setOnItemClick callback; public FileAdapter(Activity c, ArrayList<String> mLeGroup) { super(); mContext = c; fileLists = mLeGroup; mInflator = mContext.getLayoutInflater(); } public void setData(ArrayList<String> data) { this.fileLists = data; } public void setOnItemClick(FileAdapter.setOnItemClick callback) { this.callback = callback; } public ArrayList<String> getData() { return this.fileLists; } @Override public int getCount() { // TODO Auto-generated method stub return fileLists.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return fileLists.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; // General ListView optimization code. if (convertView == null) { convertView = mInflator.inflate(R.layout.item_fileadpter, null); viewHolder = new ViewHolder(); viewHolder.filepath = (TextView) convertView.findViewById(R.id.txt_path); viewHolder.chooseButton = (Button) convertView.findViewById(R.id.btn_choose); viewHolder.relativeLayout = (RelativeLayout) convertView.findViewById(R.id.rel_file); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.chooseButton.setVisibility(View.VISIBLE); String data = fileLists.get(position); int location = data.lastIndexOf("/"); if (location >= 0) { viewHolder.filepath.setText(data.substring(location)); } viewHolder.chooseButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { if (callback != null) { ShowFileActivity.SelPath = fileLists.get(position); callback.onClick(-1); } } }); viewHolder.relativeLayout.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { if (callback != null) { callback.onClick(position); } } }); return convertView; } class ViewHolder { TextView filepath; Button chooseButton; RelativeLayout relativeLayout; } interface setOnItemClick{ void onClick(int position); } }
最後核心來了,就是一個Activity,獲取資料夾列表
package com.px.smartairdatabrowser;
import java.io.File;
import java.util.ArrayList;
import com.px.smartairdatabrowser.FileAdapter.setOnItemClick;
import com.px.util.SharedPreferencesUtil;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.ListView;
public class ShowFileActivity extends Activity{
private ListView listView1;
private ArrayList<String> data = new ArrayList<String>();
private String mPath = "";
private FileAdapter fileAdapter;
public static String SelPath = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_filesel);
listView1 = (ListView)this.findViewById(R.id.listView1);
mPath = Environment.getExternalStorageDirectory().getPath();
ArrayList<String> data = new ArrayList<String>();
fileAdapter = new FileAdapter(ShowFileActivity.this,data);
listView1.setAdapter(fileAdapter);
fileAdapter.notifyDataSetChanged();
fileAdapter.setOnItemClick(new setOnItemClick() {
@Override
public void onClick(int position) {
if (position == -1) {
ShowFileActivity.this.finish();
SharedPreferencesUtil.saveData("filepath", SelPath);
}else {
mPath = fileAdapter.getData().get(position);
loadDataFrompATH(mPath);//系統版本小於6.0直接載入資料
}
}
});
initData();
}
public void doBack(View view){
ShowFileActivity.this.finish();
}
public void doBackFile(View view){
int start = mPath.lastIndexOf("/");
if (start >= 0) {
if (mPath.substring(mPath.length() - 1).equals("0")) {
ShowFileActivity.this.finish();
}else {
mPath = mPath.substring(0,start);
loadDataFrompATH(mPath);
}
}else {
ShowFileActivity.this.finish();
}
}
private void initData() {
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);//將資料載入介面卡當中
fileAdapter.notifyDataSetChanged();
}
});
}
}.start();
}
}