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