android ProgressBar實現掃描SD卡文件 + SimpleAdapter綁定ListView

代碼

activity_main.xml

<RelativeLayout 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"tools:context=".MainActivity" ><Buttonandroid:id="@+id/btnScanSD"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:layout_alignRight="@+id/btnReadFromDB"android:text="掃描SD卡中音樂文件" /><ListViewandroid:id="@+id/myList"android:layout_width="match_parent"android:layout_height="300dp"android:layout_alignParentLeft="true"android:layout_alignParentBottom="true"></ListView><Buttonandroid:id="@+id/btnReadFromDB"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/btnScanSD"android:layout_centerHorizontal="true"android:layout_marginTop="32dp"android:text="數據庫讀取音樂文件" /></RelativeLayout>

list_item.xml

<?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="match_parent"android:orientation="vertical" ><TextView android:id="@+id/txt_music_name"android:layout_width="match_parent"android:layout_height="50dp"android:singleLine="true"android:gravity="center_vertical"android:ellipsize="marquee"/></LinearLayout>
MainActivity.java

package com.progressbartest;import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.ClipData.Item;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;public class MainActivity extends Activity {//掃描路徑private static String filePath = Environment.getExternalStorageDirectory()+File.separator;//絕對路徑private static String nowPath = "";private static String str = "";//掃描文件列表private static List<String> mList = new ArrayList<String>();private SimpleAdapter adapter;private List<Map<String,Object>> items = new ArrayList<Map<String,Object>>();//定義進度對話框標識——掃描SD卡音樂文件final int PROGRESS_DIALOG = 0X112;//定義進度對話框標識——掃描數據庫音樂文件final int PROGRESS_DB = 0X111;private ProgressDialog pd;private Handler handler;private ListView myList;//當前所點擊按鈕標識  0-掃描SD卡 1-讀取數據庫private int mClickBtn = -1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//掃描SD卡音樂文件Button btnScanSD = (Button)findViewById(R.id.btnScanSD);//讀取數據庫音樂文件Button btnReadFromDB = (Button)findViewById(R.id.btnReadFromDB);myList = (ListView)findViewById(R.id.myList);btnScanSD.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubshowDialog(PROGRESS_DIALOG);}});btnReadFromDB.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubshowDialog(PROGRESS_DB);}});handler = new Handler(){public void handleMessage(Message msg){if(msg.arg1 == 1){String ss = nowPath;if(nowPath.length() > 25){ss = "..." + nowPath.substring(nowPath.length() - 22);}pd.setMessage(ss);}else if(msg.arg1 == 2){pd.dismiss();DisplayToast("掃描完畢");if(items.size()>0){items.clear();adapter.notifyDataSetChanged();}for(int i = 0; i < mList.size(); i++){Map<String,Object> item = new HashMap<String,Object>();item.put("musicName", mList.get(i).toString());//sss = mList.get(i).toString();items.add(item);}adapter = new SimpleAdapter(MainActivity.this,items,R.layout.list_item,new String[]{"musicName"},new int[]{R.id.txt_music_name});myList.setAdapter(adapter);//DisplayToast(sss);}}};}@Overridepublic Dialog onCreateDialog(int id, Bundle status){switch(id){case PROGRESS_DIALOG:pd = new ProgressDialog(this);pd.setMax(100);pd.setMessage("正在掃描,請稍后...");pd.setCancelable(false);pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);pd.setIndeterminate(false);break;case PROGRESS_DB:pd = new ProgressDialog(this);pd.setMax(100);pd.setMessage("正在掃描,請稍后...");pd.setCancelable(false);pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);pd.setIndeterminate(false);break;}return pd;}//該方法在onCreateDialog方法調用之后被回調@Overridepublic void onPrepareDialog(int id, Dialog dialog){super.onPrepareDialog(id, dialog);switch(id){case PROGRESS_DIALOG://創建新線程來執行較長時間的任務new Thread(){@Overridepublic void run(){//執行任務getScanFile(filePath);//發送執行完成消息Message message = new Message();//任務完成標志message.arg1 = 2;handler.sendMessage(message);}}.start();break;case PROGRESS_DB:new Thread(){@Overridepublic void run(){//執行任務getFromDB();//發送執行完成消息Message message = new Message();//任務完成標志message.arg1 = 2;handler.sendMessage(message);}}.start();break;}}private void getScanFile(String path){//清空列表//mList.clear();File file = new File(path);//獲取該路徑下的文件及文件夾File[] files = file.listFiles();//判斷該路徑下是否存在文件或文件夾if(files != null){//循環判斷for(int i = 0; i < files.length; i++){nowPath = files[i].getAbsolutePath();Message msg = new Message();msg.arg1 = 1;handler.sendMessage(msg);//判斷是否是文件夾if(files[i].isDirectory()){getScanFile(files[i].getAbsolutePath());}else{//判斷文件的擴展名if(files[i].getAbsolutePath().endsWith(".mp3")){//str += files[i].getName() + "\n";mList.add(files[i].getName());}}}}}/** 獲取音樂列表*/private void getFromDB(){mList.clear();//清除所有歌曲信息Cursor cur = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Audio.Media._ID,MediaStore.Audio.Media.DISPLAY_NAME,MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.DURATION,MediaStore.Audio.Media.ARTIST,MediaStore.Audio.Media.ALBUM,MediaStore.Audio.Media.YEAR,MediaStore.Audio.Media.MIME_TYPE,MediaStore.Audio.Media.SIZE,MediaStore.Audio.Media.DATA}, null, null, null);while(cur.moveToNext()){mList.add(cur.getString(1));}cur.close();}private void DisplayToast(String s){Toast.makeText(this, s, Toast.LENGTH_SHORT).show();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.activity_main, menu);return true;}}


源碼下載地址: http://download.csdn.net/detail/wangzhongshun/6316687

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447052.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447052.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447052.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++標準庫函數begin和end函數

主要的目的 為了讓指針更加簡單、安全&#xff0c;引入了begin和end函數&#xff0c;這兩個函數和容器中兩個同名的成員函數類似。但是由于數組畢竟不是類類型&#xff0c;因此這兩個函數不是成員函數。正確的使用形式就是將數組作為他們的參數int ia[] {0,1,2,3,4,5,6,7,8,9…

dex分包之--------multidex包的配置使用

目錄&#xff1a;一、前言二、產生原因三、MultiDex的簡要原理四、MultiDex的使用 一、前言 首先說一下我遇到的情況&#xff0c;最近接手了一個項目是在已有的項目里進行更新添加一些功能&#xff0c;然后該項目導了N多的包&#xff0c;在我使用Android Studio的run”App”直…

C++ primer第六章函數的學習

介紹 首先介紹函數的定義和聲明&#xff0c;包括如何傳入參數以及函數如何返回結果。C語言允許使用重載函數&#xff0c;即幾個不同的函數可以使用向同一個名字。所以接下來介紹重載函數的方法&#xff0c;以及編譯器選擇如何從函數的若干重載的形式中選取一個與調用模板相互匹…

C語言指針作為函數參數 以及智能指針作為函數參數

總所周知指針作為函數參數傳遞的時候 傳遞的是指針的拷貝&#xff08;指針也是變量&#xff09; 這里提供四種指針的傳遞方法 改到實際的指針。 #include <stdio.h> #include <memory> #include <iostream> using namespace std; void test1(char **string)…

Android Studio打包和引用aar

一、簡介 Android 庫在結構上與 Android 應用模塊相同。它可以提供構建應用所需的一切內容&#xff0c;包括源代碼、資源文件和 Android 清單。不過&#xff0c;Android 庫將編譯到您可以用作 Android 應用模塊依賴項的 Android 歸檔 (AAR) 文件&#xff0c;而不是在設備上運行…

C++ primer第六章6.4函數的學習 之函數的重載

6.4 函數的重載 函數的名字相同但是形參的列表不同&#xff0c;將其稱之為重載函數 void print(const char *cp); void print(const int *beg,const int * end); void print(const int ia[],size_t size); 形如上面所展現的這樣&#xff0c;當調用這些函數的時候&#xff0c;…

C++有限狀態機的實現

//待完善 有限狀態機是一個很常用的技術&#xff0c;在流程控制和游戲AI中都比較實用&#xff0c;因為狀態機編程簡單又很符合直覺。與有限狀態機類似的是設計模式中的狀態模式。本文是參考《Programming Game AI by Example》 一、 記得最開始工作時候也接觸過有限狀態機&…

手勢希爾排序

void shell_sort(int *data, int length){int gap0;int i0,j0;for(gaplength/2;gap>1;gap/2){//組內插入排序for(igap;i<length;i){int temp data[i];for(ji-gap;j>0&&temp<data[j];jj-gap){data[jgap]data[j];}data[jgap]temp;}} }

Android之android.os.Build

一、類概述&#xff1a;從系統屬性中提取設備硬件和版本信息。 二、內部類&#xff1a; 1、Build.VERSION 各種版本字符串 2、Build.VERSION_CODES 目前已知的版本代碼的枚舉類 三、常量&#xff1a;UNKNOWN 當一個版本屬性不知道時所設定的值。其字符串值為 “unknown” 。 …

C++ unsigned char*轉化為string的形式

unsigned char*轉化為string int main(int argc,char **argv){//unsigned char * 轉化為string//參考鏈接 https://www.itdaan.com/tw/4ff531a5e6651468a5b7c6d95927ba3dunsigned char *foo;unsigned char str[] "Hello world";string strHH;foo str;strHH.append…

KMP算法面試題

面試題&#xff1a;寫一個在一個宇符串(n)中尋找一個子串&#xff08;m)第一個位置的函數。 10G的日志中&#xff0c;如何快速地查找關鍵字&#xff1f;

C++對于程序調試很有用的系統自帶的名字

簡單介紹 __func__當前調試的函數的名字__FILE__存放文件名的字符串的字面值__LINE__存放當前行號的整型字面值__TIME__存放文件編譯時間的字符串的字面值__DATE__存放文件編譯日期的字符串的字面值 例子 if(word.size() < threshold){cerr << "Error: " …

Android中List、Set、Map數據結構詳解

Android中一般使用的數據結構有java中的基礎數據結構List&#xff0c;Set&#xff0c;Map。還有一些Android中特有的幾個&#xff0c;SparseArray(使用Map時Key是int類型的時候可以用這個代替)等。 繼承關系&#xff1a; Collection<–List<–ArrayList Collection<…

Android設計模式之——單例模式

一、介紹 單例模式是應用最廣的模式之一&#xff0c;也可能是很多初級工程師唯一會使用的設計模式。在應用這個模式時&#xff0c;單例對象的類必須保證只有一個實例存在。許多時候整個系統只需要擁有一個全局對象&#xff0c;這樣有利于我們協調系統整體的行為。 二、定義 …

我的職業生涯規劃(軟件工程)

以后筆記先在語雀整理 方便一點https://www.yuque.com/juhao-pqdor/goeie3 整理一下自己的筆記 彌補一下以前沒寫博客的遺憾吧 二十載求學路將盡&#xff0c;行文至此&#xff0c;思緒萬千。求學之路始于家鄉&#xff0c;竿轉熱河&#xff0c;而今終于石門。一路行之如人飲水…

C++ primer第六章6.5函數的學習 之特殊用途的語言特性

6.5.1 默認實參 將反復出現的數值稱為函數的默認實參&#xff0c;調用含有默認實參的時候可以包含該實參也可以不包含比如程序打開頁面會有一個默認的寬高&#xff0c;如果用戶不喜歡也允許用戶自由指定與默認數值不同的數值&#xff0c;具體例子如下圖所示 typedef string::s…

Android設計模式之——Builder模式

一、介紹 Builder模式是一步一步創建一個復雜對象的創建型模式&#xff0c;它允許用戶在不知道內部構建細節的情況下&#xff0c;可以更精細的控制對象的構造流程。該模式是為了將構建復雜對象的過程和它的部件解耦&#xff0c;使得構建過程和部件的表示隔離開來。 因為一個復…

c++后端開發書籍推薦

推薦書籍: 略讀80% 精讀50% C&#xff1a; C Primer Plus C和指針&#xff08;入門書 不只是指針&#xff09; C陷阱與缺陷&#xff08;宏相關&#xff09; C專家編程 C&#xff1a; 有專門的視頻 C primer C程序設計原理與實踐&#xff08;c之父寫的 入門經典&#xff09; Ef…

C++ primer第六章6.6函數匹配

函數的匹配 當重載函數的形參數量相等以及某些形參的類型可以由其他的類型轉化得來的時候&#xff0c;對于函數的匹配就會變得很難 確定候選函數和可行函數 函數匹配的第一步就是選定本次調用對應的重載函數集&#xff0c;集合中的函數稱為候選函數。候選函數具有兩個特征&am…