第(1)页共(37)页1、课程名称:ListView操作实例2、知识点2.1、上次课程的主要知识点2.2、本次预计讲解的知识点3、具体内容3.1、文件管理器——SD卡操作(重点)根据文件管理器显示样式,来设置布局。LinearLayoutxmlns:android=:tools=:layout_width=match_parentandroid:layout_height=match_parentandroid:orientation=verticalTextView第(2)页共(37)页android:id=@+id/title_textandroid:layout_width=match_parentandroid:layout_height=0dpandroid:layout_weight=1android:text=当前位置:/mnt/sdcardandroid:textSize=14sp/ListViewandroid:id=@+id/listandroid:layout_width=match_parentandroid:layout_height=0dpandroid:layout_weight=7android:cacheColorHint=#00000000/ListView/LinearLayout完成单行的界面设计LinearLayoutxmlns:android=:tools=:layout_width=match_parentandroid:layout_height=wrap_contentandroid:orientation=horizontal第(3)页共(37)页TextViewandroid:id=@+id/file_imgandroid:layout_width=0dpandroid:layout_height=wrap_contentandroid:layout_weight=1/TextViewandroid:id=@+id/file_nameandroid:layout_width=0dpandroid:layout_height=wrap_contentandroid:layout_weight=4android:textSize=14sp//LinearLayout将用到的图片拷贝到项目中,并准备编写自定义的Adapter。但这里的图片大小有可能有问题,因此需要编写一个Globals来计算总屏幕宽度和高度。publicclassGlobals{publicstaticintSCREEN_WIDTH;publicstaticintSCREEN_HEIGHT;//建立一个Map集合,里面封装了所有扩展名对应的图标图片,以便进行文件图标的显示publicstaticMapString,IntegerallIconImgs=new第(4)页共(37)页HashMapString,Integer();publicstaticvoidinit(Activitya){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);}}建立AdapterpublicclassFileAdapterextendsBaseAdapter{第(5)页共(37)页privateContextctx;privateListMapString,ObjectallValues=newArrayListMapString,Object();publicFileAdapter(Contextctx,ListMapString,ObjectallValues){this.ctx=ctx;this.allValues=allValues;}@OverridepublicintgetCount(){returnallValues.size();}@OverridepublicObjectgetItem(intarg0){returnallValues.get(arg0);}@OverridepubliclonggetItemId(intposition){第(6)页共(37)页returnposition;}@OverridepublicViewgetView(intposition,ViewconvertView,ViewGroupparent){if(convertView==null){convertView=LayoutInflater.from(ctx).inflate(R.layout.file_line,null);//设置高度convertView.setLayoutParams(newLayoutParams(LayoutParams.MATCH_PARENT,Globals.SCREEN_HEIGHT/9));}//取得组件TextViewfileImg=(TextView)convertView.findViewById(R.id.file_img);fileImg.getLayoutParams().height=Globals.SCREEN_HEIGHT/9;第(7)页共(37)页TextViewfileName=(TextView)convertView.findViewById(R.id.file_name);//取得数据,设置到组件里MapString,Objectmap=allValues.get(position);//设置内容,文字fileName.setText(map.get(fileName).toString());//图片要根据扩展名取得StringextName=map.get(extName).toString();//取得图片的idintimgId=Globals.allIconImgs.get(extName);//设置图片fileImg.setBackgroundResource(imgId);returnconvertView;}}最后,根据SD卡根目录下的所有文件内容,来列表显示文件。这需要用到IO流操作以及取得SD卡目录的操作。第(8)页共(37)页3.1.1、SD卡文件读取首先取得SD卡跟目录的File对象,通过listFiles方法列出该目录下的所有文件和文件夹,再根据类型来判断,如果是文件夹,进行一种处理方法,如果是文件,进行另一种处理方法。publicclassMainActivityextendsActivity{privateTextViewtitleText;privateListViewlist;privateFileAdapteradapter;privateListMapString,ObjectallValues=newArrayListMapString,Object();@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);Globals.init(this);setContentView(R.layout.activity_main);//取得组件titleText=(TextView)findViewById(R.id.title_text);list=(ListView)findViewById(R.id.list);第(9)页共(37)页//准备数据//取得SD卡根目录Fileroot=Environment.getExternalStorageDirectory();//列出该目录下的所有文件File[]allFiles=root.listFiles();//循环for(inti=0;iallFiles.length;i++){Filef=allFiles[i];MapString,Objectmap=newHashMapString,Object();map.put(fileName,f.getName());//判断是文件夹还是文件if(f.isDirectory()){//是文件夹map.put(extName,dir_close);}else{//是文件//截取出扩展名StringextName=f.getName().substring(f.getName().lastIndexOf(.)+1).toLowerCase();map.put(extName,extName);第(10)页共(37)页}allValues.add(map);}//建立Adapteradapter=newFileAdapter(this,allValues);list.setAdapter(adapter);}}下面需要加入展开某个目录的功能,为了能重复使用之前读取文件夹下内容的操作,将其封装成一个方法来使用。privatevoidloadFileData(Filedir){//列出该目录下的所有文件File[]allFiles=dir.listFiles();//设置当前位置的提示信息titleText.setText(当前位置:+dir.getAbsolutePath());//判断if(allFiles!=null){//循环for(inti=0;iallFiles.length;i++){第(11)页共(37)页Filef=allFiles[i];MapString,Objectmap=newHashMapString,Object();map.put(fileName,f.getName());//多保存一个文件的绝对路径,方便在进行点击时使用map.put(fullPath,f.getAbsolutePath());//判断是文件夹还是文件if(f.isDirectory()){//是文件夹map.put(extName,dir_close);map.put(dirFlag,true);}else{//是文件//截取出扩展名StringextName=f.getName().substring(f.getName().lastIndexOf(.)+1).toLowerCase();map.put(extName,extName);map.