zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Web框架本质及浅谈HTTP协议
    mysql
    jQuery
    Css
    html
    socket编程
    面向对象and类
    模块
    装饰器
    cef network-settings
  • 原文地址:https://www.cnblogs.com/tianshidechibang234/p/3198739.html
Copyright © 2011-2022 走看看