DBMNG数据库管理与应用

书籍是全世界的营养品。生活里没有书籍,就好像没有阳光;智慧里没有书籍,就好像鸟儿没有翅膀。
当前位置:首页 > 移动应用 > Android

Android之ListView详解(二)

三、SimpleAdapter

SimpleAdapter可以自定义拓展listview。

使用simpleAdapter的数据用一般都是HashMap构成的List,list的每一节对应ListView的每一行。HashMap的每个键值数据映射到布局文件中对应id的组件上。因为系统没有对应的布局文件可用,我们可以自己定义一个布局vlist.xml。下面做适配,new一个SimpleAdapter参数一次是:this,布局文件,HashMap的 title 和 info,img。布局文件的组件id,title,info,img。布局文件的各组件分别映射到HashMap的各元素上,完成适配。

 

[html]
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="horizontal" android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent">  
  5.     <ImageView android:id="@+id/img"  
  6.         android:layout_width="wrap_content"  
  7.         android:layout_height="wrap_content"  
  8.         android:layout_margin="5px"/>  
  9.    
  10.     <LinearLayout android:orientation="vertical"  
  11.         android:layout_width="wrap_content"  
  12.         android:layout_height="wrap_content">  
  13.    
  14.         <TextView android:id="@+id/title"  
  15.             android:layout_width="wrap_content"  
  16.             android:layout_height="wrap_content"  
  17.             android:textSize="22px" />  
  18.         <TextView android:id="@+id/info"  
  19.             android:layout_width="wrap_content"  
  20.             android:layout_height="wrap_content"  
  21.             android:textSize="13px" />  
  22.     </LinearLayout>  
  23. </LinearLayout>  
布局文件

 

 

[java]
  1. public class MainActivity extends ListActivity {  
  2.   
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.   
  7.         SimpleAdapter adapter = new SimpleAdapter(this, getData(),  
  8.                 R.layout.activity_main,  
  9.                 new String[] { "title""info""img" }, new int[] {  
  10.                         R.id.title, R.id.info, R.id.img });  
  11.         setListAdapter(adapter);  
  12.     }  
  13.   
  14.     private List<Map<String, Object>> getData() {  
  15.         List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  
  16.   
  17.         Map<String, Object> map = new HashMap<String, Object>();  
  18.         map.put("title""1");  
  19.         map.put("info"" 1 ");  
  20.         map.put("img", R.drawable.ic_launcher);  
  21.         list.add(map);  
  22.   
  23.         map = new HashMap<String, Object>();  
  24.         map.put("title""2");  
  25.         map.put("info"" 2 ");  
  26.         map.put("img", R.drawable.ic_launcher);  
  27.         list.add(map);  
  28.   
  29.         map = new HashMap<String, Object>();  
  30.         map.put("title""3");  
  31.         map.put("info"" 3 ");  
  32.         map.put("img", R.drawable.ic_launcher);  
  33.         list.add(map);  
  34.   
  35.         return list;  
  36.     }  
  37. }  
显示效果如图

 



*使用simpleadapter我们可以显示许多自定义的复杂视图,但是按钮是无法在simpleadapter中使用的。

四、BaseAdapter

BaseAdapter是一个公共基类适配器,直接提供相关控件的数据提供。

 

[html]
  1. <SPAN style="FONT-SIZE: 14px"><?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="horizontal" >  
  6.   
  7.     <ImageView  
  8.         android:id="@+id/img"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:layout_margin="5px" />  
  12.   
  13.     <LinearLayout  
  14.         android:layout_width="wrap_content"  
  15.         android:layout_height="wrap_content"  
  16.         android:orientation="vertical" >  
  17.   
  18.         <TextView  
  19.             android:id="@+id/title"  
  20.             android:layout_width="wrap_content"  
  21.             android:layout_height="wrap_content"  
  22.             android:textSize="22px" />  
  23.   
  24.         <TextView  
  25.             android:id="@+id/info"  
  26.             android:layout_width="wrap_content"  
  27.             android:layout_height="wrap_content"  
  28.             android:textSize="13px" />  
  29.     </LinearLayout>  
  30.   
  31.     <Button  
  32.         android:id="@+id/view_btn"  
  33.         android:layout_width="wrap_content"  
  34.         android:layout_height="wrap_content"  
  35.         android:layout_gravity="bottom|right"  
  36.         android:text="btn" />  
  37.   
  38. </LinearLayout></SPAN>  
布局文件

 

 

[java]
  1. <SPAN style="FONT-SIZE: 14px">public class MainActivity extends ListActivity {  
  2.     //通过一个list去映射数据显示在listview中   
  3.     private List<Map<String, Object>> mData;  
  4.   
  5.     @Override  
  6.     public void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         mData = getData();  
  9.         MyAdapter adapter = new MyAdapter(this);  
  10.         setListAdapter(adapter);  
  11.     }  
  12.   
  13.     private List<Map<String, Object>> getData() {  
  14.         List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  
  15.   
  16.         Map<String, Object> map = new HashMap<String, Object>();  
  17.         map.put("title""1");  
  18.         map.put("info"" 1 ");  
  19.         map.put("img", R.drawable.ic_launcher);  
  20.         list.add(map);  
  21.   
  22.         map = new HashMap<String, Object>();  
  23.         map.put("title""2");  
  24.         map.put("info"" 2 ");  
  25.         map.put("img", R.drawable.ic_launcher);  
  26.         list.add(map);  
  27.   
  28.         map = new HashMap<String, Object>();  
  29.         map.put("title""3");  
  30.         map.put("info"" 3 ");  
  31.         map.put("img", R.drawable.ic_launcher);  
  32.         list.add(map);  
  33.   
  34.         return list;  
  35.     }  
  36.   
  37.     // ListView 中某项被选中后的逻辑   
  38.     @Override  
  39.     protected void onListItemClick(ListView l, View v, int position, long id) {  
  40.   
  41.         Log.v("MyListView4-click", (String) mData.get(position).get("title"));  
  42.     }  
  43.   
  44.     /** 
  45.      * listview中点击按键弹出对话框 
  46.      */  
  47.     public void showInfo() {  
  48.         new AlertDialog.Builder(this).setTitle("Btn listview")  
  49.                 .setMessage("123")  
  50.                 .setPositiveButton("确定"new DialogInterface.OnClickListener() {  
  51.                     public void onClick(DialogInterface dialog, int which) {  
  52.                     }  
  53.                 }).show();  
  54.   
  55.     }  
  56.   
  57.     public final class ViewHolder {  
  58.         public ImageView img;  
  59.         public TextView title;  
  60.         public TextView info;  
  61.         public Button viewBtn;  
  62.     }  
  63.   
  64.     public class MyAdapter extends BaseAdapter {  
  65.   
  66.         private LayoutInflater mInflater;  
  67.   
  68.         public MyAdapter(Context context) {  
  69.             this.mInflater = LayoutInflater.from(context);  
  70.         }  
  71.   
  72.         public int getCount() {  
  73.             // TODO Auto-generated method stub   
  74.             return mData.size();  
  75.         }  
  76.   
  77.         public Object getItem(int arg0) {  
  78.             // TODO Auto-generated method stub   
  79.             return null;  
  80.         }  
  81.   
  82.         public long getItemId(int arg0) {  
  83.             // TODO Auto-generated method stub   
  84.             return 0;  
  85.         }  
  86.   
  87.         public View getView(int position, View convertView, ViewGroup parent) {  
  88.   
  89.             ViewHolder holder = null;  
  90.             if (convertView == null) {  
  91.   
  92.                 holder = new ViewHolder();  
  93.   
  94.                 convertView = mInflater.inflate(R.layout.activity_main, null);  
  95.                 holder.img = (ImageView) convertView.findViewById(R.id.img);  
  96.                 holder.title = (TextView) convertView.findViewById(R.id.title);  
  97.                 holder.info = (TextView) convertView.findViewById(R.id.info);  
  98.                 holder.viewBtn = (Button) convertView  
  99.                         .findViewById(R.id.view_btn);  
  100.                 convertView.setTag(holder);  
  101.   
  102.             } else {  
  103.   
  104.                 holder = (ViewHolder) convertView.getTag();  
  105.             }  
  106.   
  107.             holder.img.setBackgroundResource((Integer) mData.get(position).get(  
  108.                     "img"));  
  109.             holder.title.setText((String) mData.get(position).get("title"));  
  110.             holder.info.setText((String) mData.get(position).get("info"));  
  111.   
  112.             holder.viewBtn.setOnClickListener(new View.OnClickListener() {  
  113.   
  114.                 public void onClick(View v) {  
  115.                     showInfo();  
  116.                 }  
  117.             });  
  118.   
  119.             return convertView;  
  120.         }  
  121.   
  122.     }  
  123. }</SPAN>  
*在程序中使用ViewHolder可以极大的增加程序的效率

 

下面将对上述代码,做详细的解释,listView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到listView的长度(这也是为什么在开始的第一张图特别的标出列表长度),然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,列表将不显示同样return 1,就只显示一行。

  系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,必须手动映射数据,这需要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的布局。我们用LayoutInflater的方法将定义好的vlist2.xml文件提取成View实例用来显示。然后将xml文件中的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件上了。但是按钮为了响应点击事件,需要为它添加点击监听器,这样就能捕获点击事件。至此一个自定义的listView就完成了,现在让我们回过头从新审视这个过程。系统要绘制ListView了,他首先获得要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。在这个函数里面首先获得一个View(实际上是一个ViewGroup),然后再实例并设置各个组件,显示之。好了,绘制完这一行了。那 再绘制下一行,直到绘完为止。在实际的运行过程中会发现listView的每一行没有焦点了,这是因为Button抢夺了listView的焦点,只要布局文件中将Button设置为没有焦点就OK了。

运行效果如图

五、本次要讲的是一个listview的进阶效果,主要实现的功能是,单击显示的item时,会显示出一个大图,以突出效果,即抽屉效果的ListView。效果如下所示:

其主要实现思路是:在getView的时候,动态修改布局,将选中的item添加新的View,这样就做到了点击的时候,与其他的item不同的效果。

代码如下:

[java]
  1. public class MainActivity extends ListActivity {  
  2.       
  3.     DrawListAdapter adapter;  
  4.     int[] imgs={R.drawable.image,R.drawable.packed,R.drawable.paste,R.drawable.text,R.drawable.delete};  
  5.     String[] text={"第一抽屉","第二抽屉","第三抽屉","第四抽屉","第五抽屉"};  
  6.     int currentItem=0;  
  7.       
  8.     @Override  
  9.     public void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         adapter = new DrawListAdapter(this);  
  12.         //setListAdapter和getListView方法是ListActivity的方法,分别用于设置adapter和获得一个listview   
  13.         this.setListAdapter(adapter);  
  14.         this.getListView().setOnItemClickListener(new OnItemClickListener(){  
  15.   
  16.             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,  
  17.                     long arg3) {  
  18.                 // TODO Auto-generated method stub   
  19.                 currentItem=arg2;  
  20.                 //notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView   
  21.                 adapter.notifyDataSetChanged();  
  22.             }  
  23.         });  
  24.     }  
  25.       
  26.     public class DrawListAdapter extends BaseAdapter{  
  27.   
  28.         Activity activity;  
  29.         LayoutInflater inflater;  
  30.           
  31.         public DrawListAdapter(Activity a){  
  32.             activity=a;  
  33.             inflater=activity.getLayoutInflater();  
  34.         }  
  35.           
  36.         public int getCount() {  
  37.             // TODO Auto-generated method stub   
  38.             return imgs.length;  
  39.         }  
  40.   
  41.         public Object getItem(int arg0) {  
  42.             // TODO Auto-generated method stub   
  43.             return null;  
  44.         }  
  45.   
  46.         public long getItemId(int position) {  
  47.             // TODO Auto-generated method stub   
  48.             return position;  
  49.         }  
  50.   
  51.         public View getView(int position, View convertView, ViewGroup arg2) {  
  52.             // TODO Auto-generated method stub   
  53.             LinearLayout layout=new LinearLayout(activity);  
  54.             layout.setOrientation(LinearLayout.VERTICAL);  
  55.             layout.addView(addTitleView(position));  
  56.             if(currentItem==position){  
  57.                 layout.addView(addCustomView(position));  
  58.             }  
  59.             return layout;  
  60.         }  
  61.           
  62.         //获取选中项的内容   
  63.         private View addCustomView(int i) {  
  64.             // TODO Auto-generated method stub   
  65.             View view=new View(activity);  
  66.             ImageView iv=new ImageView(activity);  
  67.             //根据点击的position设置相应要显示的图片   
  68.             switch (i) {  
  69.             case 0:  
  70.                 iv.setImageResource(R.drawable.ic_launcher);  
  71.                 view=iv;  
  72.                 break;  
  73.             case 1:  
  74.                 iv.setImageResource(R.drawable.ic_launcher);  
  75.                 view=iv;  
  76.                 break;  
  77.             case 2:  
  78.                 iv.setImageResource(R.drawable.ic_launcher);  
  79.                 view=iv;  
  80.                 break;  
  81.             case 3:  
  82.                 iv.setImageResource(R.drawable.ic_launcher);  
  83.                 view=iv;  
  84.                 break;  
  85.             case 4:  
  86.                 iv.setImageResource(R.drawable.ic_launcher);  
  87.                 view=iv;  
  88.                 break;  
  89.             }  
  90.             return view;  
  91.         }  
  92.           
  93.         //获取list的标题内容   
  94.         private View addTitleView(int i) {  
  95.             // TODO Auto-generated method stub   
  96.             LinearLayout layout=new LinearLayout(activity);  
  97.             layout.setOrientation(LinearLayout.HORIZONTAL);  
  98.             ImageView iv=new ImageView(activity);  
  99.             iv.setImageResource(imgs[i]);  
  100.             layout.addView(iv,new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT));  
  101.             TextView tv=new TextView(activity);  
  102.             tv.setText(text[i]);  
  103.             layout.addView(tv,new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT));  
  104.             layout.setGravity(Gravity.CENTER);  
  105.             return layout;  
  106.         }  
  107.           
  108.     }  
  109. }  

 

本站文章内容,部分来自于互联网,若侵犯了您的权益,请致邮件chuanghui423#sohu.com(请将#换为@)联系,我们会尽快核实后删除。
Copyright © 2006-2023 DBMNG.COM All Rights Reserved. Powered by DEVSOARTECH            豫ICP备11002312号-2

豫公网安备 41010502002439号