android ListView布局之三(使用自定义的Adapter绑定数据,通过contextView.setTag绑定数据)有按钮的ListView

http://blog.csdn.net/chenzheng_java/article/details/6202586

最终结果图:

 

 

代码结构示意图

 

 

 

 

vlist2.xml代码:

 

[xhtml]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout  
  3.   xmlns:android="http://schemas.android.com/apk/res/android"  
  4.   android:layout_width="fill_parent"  
  5.   android:layout_height="fill_parent">  
  6.     
  7.   <ImageView  
  8.     android:id="@+id/image"  
  9.     android:layout_width="wrap_content"  
  10.     android:layout_height="wrap_content"  
  11.     android:layout_margin="5px"  
  12.   />  
  13.     
  14.   <LinearLayout  
  15.     android:layout_width="wrap_content"  
  16.     android:layout_height="wrap_content"  
  17.     android:orientation="vertical"  
  18.   >  
  19.     <TextView  
  20.         android:id="@+id/title"  
  21.         android:layout_width="wrap_content"   
  22.         android:layout_height="wrap_content"    
  23.         android:textColor="#FFFFFFFF"   
  24.         android:textSize="22px"   
  25.           
  26.     />  
  27.     <TextView  
  28.         android:id="@+id/info"  
  29.         android:layout_width="wrap_content"   
  30.         android:layout_height="wrap_content"    
  31.         android:textColor="#FFFFFFFF"   
  32.         android:textSize="13px"   
  33.           
  34.     />  
  35.   </LinearLayout>  
  36.     
  37.   <Button  
  38.     android:id="@+id/view_btn"  
  39.     android:layout_width="wrap_content"   
  40.     android:layout_height="wrap_content"  
  41.     android:text="click me"  
  42.     android:gravity="center"  
  43.   />  
  44.     
  45.     
  46. </LinearLayout>  

listView3.java代码

 

[java]  view plain copy
  1. package cn.com.android2.listview;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5.   
  6. import android.app.ListActivity;  
  7. import android.os.Bundle;  
  8. import android.util.Log;  
  9. import android.view.View;  
  10. import android.widget.ListView;  
  11.   
  12. public class listView3 extends ListActivity {  
  13.     @Override  
  14.     public void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         // 获取虚拟的数据,数据的格式有严格的要求哦  
  17.         ArrayList<HashMap<String, Object>> data = getData();  
  18.         //模仿SimpleAdapter实现的自己的adapter  
  19.         MyAdapter adapter = new MyAdapter(this, data);  
  20.           
  21.         /** 
  22.          * 有些人很迷糊,我们都知道vlist2.xml相当于存储一行数据的组件布局,我们在前边的代码中,都是有一个主布局文件main.xml的, 
  23.          * 组件布局文件是放在主布局文件上显示的,一般代码中都是通过setContentView()来指定主布局文件的。为何这里根本就没有用到 
  24.          * ,但是listView还能有一个界面来呈现呢。 
  25.          * 让我们看看setListAdapter在ListActivity中的实现, 
  26.          * public void setListAdapter(ListAdapter adapter) { 
  27.             synchronized (this) { 
  28.             ensureList(); 
  29.             mAdapter = adapter; 
  30.             mList.setAdapter(adapter); 
  31.         } 
  32.     } 
  33.     里面调用了一个ensureList方法,我们再来看看这个方法: 
  34.      private void ensureList() { 
  35.         if (mList != null) { 
  36.             return; 
  37.         } 
  38.         setContentView(com.android.internal.R.layout.list_content); 
  39.  
  40.     } 
  41.     现在看到了,这里有个 setContentView方法,里面设置了我们的组件在一个android自己提供的界面上显示。 
  42.     原来,我们的理论还是适用的,只不过ListActivity给我进行了隐藏实现。 
  43.          */  
  44.         setListAdapter(adapter);  
  45.           
  46.           
  47.           
  48.     }  
  49.   
  50.     /** 
  51.      * @author chenzheng_java 
  52.      * @description 准备一些测试数据 
  53.      * @return 一个包含了数据信息的hashMap集合 
  54.      */  
  55.     private ArrayList<HashMap<String, Object>> getData(){  
  56.         ArrayList<HashMap<String, Object>> arrayList = new ArrayList<HashMap<String,Object>>();  
  57.         for(int i=0;i<10;i++){  
  58.             HashMap<String, Object> tempHashMap = new HashMap<String, Object>();  
  59.             tempHashMap.put("image", R.drawable.icon);  
  60.             tempHashMap.put("title""标题"+i);  
  61.             tempHashMap.put("info""描述性信息");  
  62.             arrayList.add(tempHashMap);  
  63.         }  
  64.         return arrayList;  
  65.     }  
  66.   
  67.     @Override  
  68.     protected void onListItemClick(ListView l, View v, int position, long id) {  
  69.           
  70.         Log.i("输出信息",v.toString() );  
  71.     }  
  72.       
  73.       
  74.       
  75. }  

zujian.java

[java]  view plain copy
  1. package cn.com.android2.listview;  
  2.   
  3. import android.widget.Button;  
  4. import android.widget.ImageView;  
  5. import android.widget.TextView;  
  6.   
  7. public final class ZuJian {  
  8.   
  9.     public ImageView imageView;  
  10.     public TextView titleView;  
  11.     public TextView infoView;  
  12.     public Button button;  
  13.       
  14.       
  15. }  

MyAdapter.java

[java]  view plain copy
  1. package cn.com.android2.listview;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5.   
  6. import android.app.AlertDialog;  
  7. import android.content.Context;  
  8. import android.content.DialogInterface;  
  9. import android.view.LayoutInflater;  
  10. import android.view.View;  
  11. import android.view.ViewGroup;  
  12. import android.view.View.OnClickListener;  
  13. import android.widget.BaseAdapter;  
  14. import android.widget.Button;  
  15. import android.widget.ImageView;  
  16. import android.widget.TextView;  
  17. /** 
  18.  * @author chenzheng_java 
  19.  * @description 该类的部分实现模仿了SimpleAdapter 
  20.  */  
  21. public class MyAdapter extends BaseAdapter {  
  22.       
  23.     private ArrayList<HashMap<String, Object>> data;  
  24.     /** 
  25.      * LayoutInflater 类是代码实现中获取布局文件的主要形式 
  26.      *LayoutInflater layoutInflater = LayoutInflater.from(context); 
  27.      *View convertView = layoutInflater.inflate(); 
  28.      *LayoutInflater的使用,在实际开发种LayoutInflater这个类还是非常有用的,它的作用类似于 findViewById(), 
  29.     不同点是LayoutInflater是用来找layout下xml布局文件,并且实例化! 
  30.     而findViewById()是找具体xml下的具体 widget控件(如:Button,TextView等)。 
  31.      */  
  32.     private LayoutInflater layoutInflater;  
  33.     private Context context;  
  34.       
  35.       
  36.     public MyAdapter(Context context,ArrayList<HashMap<String, Object>> data) {  
  37.           
  38.         this.context = context;  
  39.         this.data = data;  
  40.         this.layoutInflater = LayoutInflater.from(context);  
  41.     }  
  42.   
  43.     /** 
  44.      *获取列数  
  45.      */  
  46.     public int getCount() {  
  47.         return data.size();  
  48.     }  
  49.     /** 
  50.      *获取某一位置的数据  
  51.      */  
  52.     public Object getItem(int position) {  
  53.         return data.get(position);  
  54.     }  
  55.     /** 
  56.      *获取唯一标识 
  57.      */  
  58.     public long getItemId(int position) {  
  59.         return position;  
  60.     }  
  61.   
  62.     /** 
  63.      * android绘制每一列的时候,都会调用这个方法 
  64.      */  
  65.     public View getView(int position, View convertView, ViewGroup parent) {  
  66.         ZuJian zuJian = null;  
  67.         if(convertView==null){  
  68.             zuJian = new ZuJian();  
  69.             // 获取组件布局  
  70.             convertView = layoutInflater.inflate(R.layout.vlist2, null);  
  71.             zuJian.imageView = (ImageView) convertView.findViewById(R.id.image);  
  72.             zuJian.titleView = (TextView) convertView.findViewById(R.id.title);  
  73.             zuJian.infoView = (TextView) convertView.findViewById(R.id.info);  
  74.             zuJian.button = (Button) convertView.findViewById(R.id.view_btn);  
  75.             // 这里要注意,是使用的tag来存储数据的。  
  76.             convertView.setTag(zuJian);  
  77.         }  
  78.         else {  
  79.             zuJian = (ZuJian) convertView.getTag();  
  80.         }  
  81.         // 绑定数据、以及事件触发  
  82.         zuJian.imageView.setBackgroundResource((Integer) data.get(position).get("image"));  
  83.         zuJian.titleView.setText((String)data.get(position).get("title"));  
  84.         zuJian.infoView.setText((String)data.get(position).get("info"));  
  85.         zuJian.button.setOnClickListener(new OnClickListener(){  
  86.   
  87.             public void onClick(View v) {  
  88.                 showInfo();  
  89.             }  
  90.               
  91.         });  
  92.         return convertView;  
  93.     }  
  94.   
  95.     /** 
  96.      *当用户点击按钮时触发的事件,会弹出一个确认对话框 
  97.      */  
  98.      public void showInfo(){    
  99.   
  100.                  new AlertDialog.Builder(context)    
  101.   
  102.                  .setTitle("我的listview")    
  103.   
  104.                 .setMessage("介绍...")    
  105.   
  106.                 .setPositiveButton("确定"new DialogInterface.OnClickListener() {    
  107.   
  108.                 public void onClick(DialogInterface dialog, int which) {    
  109.   
  110.                      }    
  111.   
  112.                  })    
  113.   
  114.                .show();    
  115.   
  116.                      
  117.   
  118.             }    
  119.   
  120. }  

废话连篇:

 

 代码中的注释已经解释的很清楚了,这里再次强调一遍,三步骤

第一步:准备主布局文件、组件布局文件等

第二步:获取并整理数据

第三部:绑定数据,这里我们是通过自己编写adapter来完成的。

 

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了。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值