1 1. public class ListFiles extends Activity 2 { 3 ListView Listview=null; 4 protected void onCreate(Bundle savedInstanceState) 5 { 6 super.onCreate(savedInstanceState); 7 super.setContentView(R.layout.files); 8 Listview=(ListView) super.findViewById(R.id.list);//获取listview控件 9 //Listview.setItemsCanFocus(false); 10 11 //设置listview的数据源这里的ListViewAdapter是一个继承自BaseAdapter的类对象,其内容在下面: 12 ListViewAdapter adapter= new ListViewAdapter(this, serachFile(),R.layout.listview_item_layout,new String[]{"img","title","info","button"}, new int[]{R.id.imageView1,R.id.textView1,R.id.textView2,R.id.imagebutton1}); 13 14 15 Listview.setAdapter(adapter); 16 //this.setContentView(Listview); 17 //为listview添加事件监听器 18 Listview.setOnItemClickListener(new OnItemClickListener(){ 19 public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) 20 { 21 Toast.makeText(ListFiles.this, "你点了第"+(arg2+1)+"项", Toast.LENGTH_LONG).show(); 22 } 23 24 }); 25 } 26 //从sdcard中扫描文件 27 public List<Map<String,Object>> serachFile() 28 { 29 List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); 30 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) 31 { 32 File file=new File(Environment.getExternalStorageDirectory().toString()+"/RecorderFile"); 33 File[] files=file.listFiles(); 34 35 for(int i=0;i<files.length;i++) 36 { 37 if(files[i].getName().endsWith(".3gp")) 38 { 39 Map<String,Object> map=new HashMap<String,Object>(); 40 map.put("img", R.drawable.ic_launcher); 41 map.put("title", files[i].getName()); 42 map.put("info", files[i].getPath()); 43 map.put("button", R.drawable.control_play_blue); 44 list.add(map); 45 } 46 } 47 System.out.println("**************"+Environment.getExternalStorageState()); 48 } 49 return list; 50 } 51 52 } 53 54 55 56 57 58 2.继承自BaseAdapter 的 ListViewAdapter类 59 60 public class ListViewAdapter extends BaseAdapter 61 { 62 private Context myContext; 63 List<Map<String,Object>> listMap; 64 LayoutInflater flater; 65 private int[] ID; 66 private String[] InforMation; 67 private int layoutID; 68 private MediaPlayer Media; 69 //次构造方法将调用此对象的数据传送过来,并通过声明对象来获取对象 70 public ListViewAdapter(ListFiles listFiles,List<Map<String, Object>> listMap2, int listviewItemLayout, 71 String[] strings, int[] is) 72 { 73 this.myContext=listFiles; 74 listMap=listMap2;//存储map的集合,也就是listview的所有数据 75 layoutID=listviewItemLayout;//listviewItem的布局文件也就是自定义listview中的控件的布局文件 76 ID=is; 77 InforMation=strings; 78 flater=LayoutInflater.from(myContext); 79 80 } 81 public int getCount() 82 { 83 return listMap.size(); 84 } 85 public Object getItem(int position) 86 { 87 return 0; 88 } 89 public long getItemId(int id) { 90 return id; 91 } 92 93 public View getView( int position, View view, ViewGroup parent) 94 { 95 view=flater.inflate(layoutID, null)//通过LayoutInflater对象来获取到他的view控件内容 96 97 98 //这个循环是:listview中每一项中的数据控件,通过此方法来进行填充 99 for (int i = 0; i < InforMation.length; i++) 100 {//备注1 101 if (view.findViewById(ID[i]) instanceof ImageView) 102 { 103 //这里的instaceof是如果当前找到的控件是ImageView控件的话,获取到他的控件,并设置其数据,而数据就存放到一个string类型的数组里这里是InforMation;其中的控件 的id已经存放到一个整形数组里面(ID);这里不能使ID[position]因为这是设置listview中每一项中的数据,所以要用到ID[i];listMap.get(position)是获取到当前listview中的Item 而不是Item中的数据 104 ImageView img = (ImageView) view.findViewById(ID[i]); 105 img.setBackgroundResource((Integer)listMap.get(position).get(InforMation[i])); 106 107 } 108 else if (view.findViewById(ID[i]) instanceof TextView) 109 { 110 TextView title=(TextView) view.findViewById(ID[i]); 111 title.setText(listMap.get(position).get(InforMation[i]).toString()); 112 } 113 else if(view.findViewById(ID[i]) instanceof ImageButton) 114 { 115 ImageButton btn=(ImageButton) view.findViewById(ID[i]); 116 btn.setImageURI(Uri.parse(listMap.get(position).get(InforMation[i]).toString())); 117 } 118 119 120 } 121 addListener(view,position); 122 return view;//把数据中的每一项冲送个listview控件 123 124 } 125 private void addListener(View view, final int position) { 126 view.findViewById(R.id.imagebutton1).setOnClickListener(new OnClickListener(){ 127 public void onClick(View v) 128 { 129 showDialog(position); 130 Toast.makeText(myContext, listMap.get(position).get("info").toString(), Toast.LENGTH_LONG).show(); 131 } 132 }); 133 } 134 135 //这个方法是播放当前选中的媒体文件 136 public void showDialog(int position) 137 { 138 139 try 140 { 141 //其中MediaPlayer media=new MediaPlayer()不能这样写(有些情况),否则会报错 142 Media=MediaPlayer.create(myContext, Uri.parse(listMap.get(position).get("info").toString())); 143 if(Media!=null) 144 { 145 Media.stop(); 146 } 147 Media.prepare(); 148 Media.start(); 149 150 Builder dialog=new AlertDialog.Builder(myContext); 151 dialog.setTitle("温情提示!"); 152 dialog.setMessage("正在播放的是:"+listMap.get(position).get("info").toString()); 153 dialog.setIcon(R.drawable.sound); 154 dialog.setCancelable(true); 155 dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() { 156 public void onClick(DialogInterface dialog, int which) 157 { 158 Media.stop(); 159 //Media.release(); 160 dialog.dismiss(); 161 } 162 }); 163 dialog.show(); 164 } 165 catch (Exception e) 166 { 167 e.printStackTrace(); 168 } 169 170 } 171 172 } 173 174 175 176 注意:listview是通过自定义的布局文件中的话,如果其中包括button,checkBox等可选择的控件这样会让listview的item失去焦点;可以把button 177 的focusable属性设置为false这样button控件就自动放弃获得焦点,listview中的item就会获得焦点还有一种是:把自定义的的布局文件的根节点设置为:
android:descendantFocusability="blocksDescendants"这样就可以阻止listview中的控件来获得焦点 179