1. 程式人生 > >android 自定義資料夾管理器

android 自定義資料夾管理器

自定義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>

大概就是這個樣子的

檔案件item

然後在寫個介面卡 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();

    } 
 

}

參考的這位大神的文章寫的,多謝幫忙解決問題