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.mzph.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…