Android 的ListView操作例項,檔案管理器SD卡的讀取操作
阿新 • • 發佈:2019-02-09
檔案管理器SD卡:
實現效果:
點選後的效果:
下面來具體實現步驟:
檔案管理器顯示樣式,來設定佈局。
建立專案對Androidmanifest修改:
一、編寫activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/title_text" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:gravity="center_vertical" android:text="當前位置: /mnt/sdcard" android:textSize="14sp" /> <ListView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="8" android:cacheColorHint="#00000000" > </ListView> </LinearLayout>
顯示的樣式:
編寫file_line.xml完成單行資料處理:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/file_img" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" /> <TextView android:id="@+id/file_name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="4" android:textSize="14sp" /> </LinearLayout>
將用到的圖片拷貝到專案中,並準備編寫自定義的Adapter。
但這裡的圖片大小有可能有問題,因此需要編寫一個Globals來計算總螢幕寬度和高度。
public class Globals { public static int SCREEN_WIDTH; public static int SCREEN_HEIGHT; // 建立一個Map集合, 裡面封裝了所有副檔名對應的圖示圖片, 以便進行檔案圖示的顯示 public static Map<String, Integer> allIconImgs = new HashMap<String, Integer>(); public static void init(Activity a) { SCREEN_WIDTH = a.getWindowManager().getDefaultDisplay().getWidth(); SCREEN_HEIGHT = a.getWindowManager().getDefaultDisplay().getHeight(); // 初始化所有副檔名和圖片的對應關係 allIconImgs.put("txt", R.drawable.txt_file); allIconImgs.put("mp3", R.drawable.mp3_file); allIconImgs.put("mp4", R.drawable.mp4_file); allIconImgs.put("bmp", R.drawable.image_file); allIconImgs.put("gif", R.drawable.image_file); allIconImgs.put("png", R.drawable.image_file); allIconImgs.put("jpg", R.drawable.image_file); allIconImgs.put("dir_open", R.drawable.open_dir); allIconImgs.put("dir_close", R.drawable.close_dir); } }
三、建立Adapter
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.liky.file.R;
import org.liky.file.util.Globals;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView.LayoutParams;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class FileAdapter extends BaseAdapter {
private Context ctx;
private List<Map<String, Object>> allValues = new ArrayList<Map<String, Object>>();
public FileAdapter(Context ctx, List<Map<String, Object>> allValues) {
this.ctx = ctx;
this.allValues = allValues;
}
@Override
public int getCount() {
return allValues.size();
}
@Override
public Object getItem(int arg0) {
return allValues.get(arg0);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(ctx).inflate(R.layout.file_line,
null);
// 設定高度
convertView.setLayoutParams(new LayoutParams(
LayoutParams.MATCH_PARENT, Globals.SCREEN_HEIGHT / 9));
}
// 取得元件
TextView fileImg = (TextView) convertView.findViewById(R.id.file_img);
fileImg.getLayoutParams().height = Globals.SCREEN_HEIGHT / 9;
TextView fileName = (TextView) convertView.findViewById(R.id.file_name);
// 取得資料,設定到元件裡
Map<String, Object> map = allValues.get(position);
// 設定內容, 文字
fileName.setText(map.get("fileName").toString());
// 圖片要根據副檔名取得
String extName = map.get("extName").toString();
// 取得圖片的id
int imgId = Globals.allIconImgs.get(extName);
// 設定圖片
fileImg.setBackgroundResource(imgId);
return convertView;
}
}
四、編寫Activity
import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.liky.file.adapter.FileAdapter; import org.liky.file.util.Globals; import android.app.Activity; import android.app.AlertDialog.Builder; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.Bundle; import android.os.Environment; import android.view.KeyEvent; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ListView; import android.widget.TextView; public class MainActivity extends Activity { private TextView titleText; private ListView list; private FileAdapter adapter; private List<Map<String, Object>> allValues = new ArrayList<Map<String, Object>>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Globals.init(this); setContentView(R.layout.activity_main); // 取得元件 titleText = (TextView) findViewById(R.id.title_text); list = (ListView) findViewById(R.id.list); // 準備資料 // 取得SD卡根目錄 File root = Environment.getExternalStorageDirectory(); loadFileData(root); // 建立Adapter adapter = new FileAdapter(this, allValues); list.setAdapter(adapter); // 加入監聽事件 list.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // 取得當前操作的資料 Map<String, Object> map = allValues.get(arg2); // 判斷所點的是檔案還是資料夾 boolean dirFlag = (Boolean) map.get("dirFlag"); if (dirFlag) { // 資料夾 // 建立該資料夾的File物件 // 取得絕對路徑 String fullPath = (String) map.get("fullPath"); // 建立File File dir = new File(fullPath); // 先清空原有資料 allValues.clear(); if (!Environment.getExternalStorageDirectory() .getAbsolutePath().equals(fullPath)) { // 加入返回上一級的操作行 Map<String, Object> parent = new HashMap<String, Object>(); parent.put("fileName", "返回上一級"); parent.put("extName", "dir_open"); parent.put("dirFlag", true); parent.put("fullPath", dir.getParent()); // 儲存一個標誌 parent.put("flag", "TRUE"); // 將這一行加入到資料集合中 allValues.add(parent); } // 加入新資料 loadFileData(dir); // 使用Adapter通知介面ListView,資料已經被修改了,你也要一起改 adapter.notifyDataSetChanged(); } else { // 彈出該檔案的詳細資訊 File f = new File((String) map.get("fullPath")); // 建立對話方塊 Builder builder = new Builder(MainActivity.this); builder.setTitle("詳細資訊"); builder.setMessage("檔案大小: " + f.length() + "\r\n" + "檔名:" + f.getName()); // 最多允許加入3個按鈕, // 注意監聽中匯入的支援包不再是之前的OnCliCkListener,而是DialogInterface下的這個監聽 builder.setPositiveButton("關閉", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); // 建立對話方塊,並顯示 builder.create().show(); } } }); list.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> arg0, View arg1, final int arg2, long arg3) { // 取得資料 Map<String, Object> map = allValues.get(arg2); final File f = new File(map.get("fullPath").toString()); if (f.isFile()) { // 彈出確認框 Builder builder = new Builder(MainActivity.this); builder.setTitle("提示"); builder.setMessage("確定要刪除該檔案(" + f.getName() + ")嗎?"); builder.setPositiveButton("確定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 將SD卡中的檔案刪除 if (f.exists()) { f.delete(); } // 將列表中的資料刪除 allValues.remove(arg2); // 通知 adapter.notifyDataSetChanged(); } }); builder.setNegativeButton("取消", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); builder.create().show(); } return false; } }); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // 根據keyCode判斷使用者按下了哪個鍵 if (keyCode == KeyEvent.KEYCODE_BACK) { // 判斷當前是否在SD卡跟目錄. // 取得第一行資料 Map<String, Object> map = allValues.get(0); if ("TRUE".equals(map.get("flag"))) { // 裡面,需要返回上一級 list.performItemClick(list.getChildAt(0), 0, list.getChildAt(0) .getId()); } else { // 彈出提示框 Builder builder = new Builder(MainActivity.this); builder.setTitle("提示"); builder.setMessage("親,真的要離開我嗎?"); builder.setPositiveButton("真的", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 關閉當前Activity finish(); } }); builder.setNegativeButton("再待會兒", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); builder.create().show(); } return false; } return super.onKeyDown(keyCode, event); } private void loadFileData(File dir) { // 列出該目錄下的所有檔案 File[] allFiles = dir.listFiles(); // 設定當前位置的提示資訊 titleText.setText("當前位置: " + dir.getAbsolutePath()); // 判斷 if (allFiles != null) { // 迴圈 for (int i = 0; i < allFiles.length; i++) { File f = allFiles[i]; Map<String, Object> map = new HashMap<String, Object>(); map.put("fileName", f.getName()); // 多儲存一個檔案的絕對路徑,方便在進行點選時使用 map.put("fullPath", f.getAbsolutePath()); // 判斷是資料夾還是檔案 if (f.isDirectory()) { // 是資料夾 map.put("extName", "dir_close"); map.put("dirFlag", true); } else { // 是檔案 // 截取出副檔名 String extName = f.getName() .substring(f.getName().lastIndexOf(".") + 1) .toLowerCase(); map.put("extName", extName); map.put("dirFlag", false); } allValues.add(map); } } } }