Android中ListView通过BaseAdapter实现数据的绑定

  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
原文地址:https://www.cnblogs.com/tianshidechibang234/p/3198739.html