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


    vlist2.xml代码:

    <?xml version="1.0" encoding="utf-8"?>  
    <LinearLayout  
      xmlns:android="http://schemas.android.com/apk/res/android"  
      android:layout_width="fill_parent"  
      android:layout_height="fill_parent">  
        
      <ImageView  
        android:id="@+id/image"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_margin="5px"  
      />  
        
      <LinearLayout  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:orientation="vertical"  
      >  
        <TextView  
            android:id="@+id/title"  
            android:layout_width="wrap_content"   
            android:layout_height="wrap_content"    
            android:textColor="#FFFFFFFF"   
            android:textSize="22px"   
              
        />  
        <TextView  
            android:id="@+id/info"  
            android:layout_width="wrap_content"   
            android:layout_height="wrap_content"    
            android:textColor="#FFFFFFFF"   
            android:textSize="13px"   
              
        />  
      </LinearLayout>  
        
      <Button  
        android:id="@+id/view_btn"  
        android:layout_width="wrap_content"   
        android:layout_height="wrap_content"  
        android:text="click me"  
        android:gravity="center"  
      />  
        
        
    </LinearLayout>  

    listView3.java代码

    package cn.com.android2.listview;  
      
    import java.util.ArrayList;  
    import java.util.HashMap;  
      
    import android.app.ListActivity;  
    import android.os.Bundle;  
    import android.util.Log;  
    import android.view.View;  
    import android.widget.ListView;  
      
    public class listView3 extends ListActivity {  
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            // 获取虚拟的数据,数据的格式有严格的要求哦  
            ArrayList<HashMap<String, Object>> data = getData();  
            //模仿SimpleAdapter实现的自己的adapter  
            MyAdapter adapter = new MyAdapter(this, data);  
              
            /** 
             * 有些人很迷糊,我们都知道vlist2.xml相当于存储一行数据的组件布局,我们在前边的代码中,都是有一个主布局文件main.xml的, 
             * 组件布局文件是放在主布局文件上显示的,一般代码中都是通过setContentView()来指定主布局文件的。为何这里根本就没有用到 
             * ,但是listView还能有一个界面来呈现呢。 
             * 让我们看看setListAdapter在ListActivity中的实现, 
             * public void setListAdapter(ListAdapter adapter) { 
                synchronized (this) { 
                ensureList(); 
                mAdapter = adapter; 
                mList.setAdapter(adapter); 
            } 
        } 
        里面调用了一个ensureList方法,我们再来看看这个方法: 
         private void ensureList() { 
            if (mList != null) { 
                return; 
            } 
            setContentView(com.android.internal.R.layout.list_content); 
     
        } 
        现在看到了,这里有个 setContentView方法,里面设置了我们的组件在一个android自己提供的界面上显示。 
        原来,我们的理论还是适用的,只不过ListActivity给我进行了隐藏实现。 
             */  
            setListAdapter(adapter);  
              
              
              
        }  
      
        /** 
         * @author chenzheng_java 
         * @description 准备一些测试数据 
         * @return 一个包含了数据信息的hashMap集合 
         */  
        private ArrayList<HashMap<String, Object>> getData(){  
            ArrayList<HashMap<String, Object>> arrayList = new ArrayList<HashMap<String,Object>>();  
            for(int i=0;i<10;i++){  
                HashMap<String, Object> tempHashMap = new HashMap<String, Object>();  
                tempHashMap.put("image", R.drawable.icon);  
                tempHashMap.put("title", "标题"+i);  
                tempHashMap.put("info", "描述性信息");  
                arrayList.add(tempHashMap);  
            }  
            return arrayList;  
        }  
      
        @Override  
        protected void onListItemClick(ListView l, View v, int position, long id) {  
              
            Log.i("输出信息",v.toString() );  
        }  
          
          
          
    }  

    zujian.java

    package cn.com.android2.listview;  
      
    import android.widget.Button;  
    import android.widget.ImageView;  
    import android.widget.TextView;  
      
    public final class ZuJian {  
      
        public ImageView imageView;  
        public TextView titleView;  
        public TextView infoView;  
        public Button button;  
          
          
    }  

    MyAdapter.java

    package cn.com.android2.listview;  
      
    import java.util.ArrayList;  
    import java.util.HashMap;  
      
    import android.app.AlertDialog;  
    import android.content.Context;  
    import android.content.DialogInterface;  
    import android.view.LayoutInflater;  
    import android.view.View;  
    import android.view.ViewGroup;  
    import android.view.View.OnClickListener;  
    import android.widget.BaseAdapter;  
    import android.widget.Button;  
    import android.widget.ImageView;  
    import android.widget.TextView;  
    /** 
     * @author chenzheng_java 
     * @description 该类的部分实现模仿了SimpleAdapter 
     */  
    public class MyAdapter extends BaseAdapter {  
          
        private ArrayList<HashMap<String, Object>> data;  
        /** 
         * LayoutInflater 类是代码实现中获取布局文件的主要形式 
         *LayoutInflater layoutInflater = LayoutInflater.from(context); 
         *View convertView = layoutInflater.inflate(); 
         *LayoutInflater的使用,在实际开发种LayoutInflater这个类还是非常有用的,它的作用类似于 findViewById(), 
        不同点是LayoutInflater是用来找layout下xml布局文件,并且实例化! 
        而findViewById()是找具体xml下的具体 widget控件(如:Button,TextView等)。 
         */  
        private LayoutInflater layoutInflater;  
        private Context context;  
          
          
        public MyAdapter(Context context,ArrayList<HashMap<String, Object>> data) {  
              
            this.context = context;  
            this.data = data;  
            this.layoutInflater = LayoutInflater.from(context);  
        }  
      
        /** 
         *获取列数  
         */  
        public int getCount() {  
            return data.size();  
        }  
        /** 
         *获取某一位置的数据  
         */  
        public Object getItem(int position) {  
            return data.get(position);  
        }  
        /** 
         *获取唯一标识 
         */  
        public long getItemId(int position) {  
            return position;  
        }  
      
        /** 
         * android绘制每一列的时候,都会调用这个方法 
         */  
        public View getView(int position, View convertView, ViewGroup parent) {  
            ZuJian zuJian = null;  
            if(convertView==null){  
                zuJian = new ZuJian();  
                // 获取组件布局  
                convertView = layoutInflater.inflate(R.layout.vlist2, null);  
                zuJian.imageView = (ImageView) convertView.findViewById(R.id.image);  
                zuJian.titleView = (TextView) convertView.findViewById(R.id.title);  
                zuJian.infoView = (TextView) convertView.findViewById(R.id.info);  
                zuJian.button = (Button) convertView.findViewById(R.id.view_btn);  
                // 这里要注意,是使用的tag来存储数据的。  
                convertView.setTag(zuJian);  
            }  
            else {  
                zuJian = (ZuJian) convertView.getTag();  
            }  
            // 绑定数据、以及事件触发  
            zuJian.imageView.setBackgroundResource((Integer) data.get(position).get("image"));  
            zuJian.titleView.setText((String)data.get(position).get("title"));  
            zuJian.infoView.setText((String)data.get(position).get("info"));  
            zuJian.button.setOnClickListener(new OnClickListener(){  
      
                public void onClick(View v) {  
                    showInfo();  
                }  
                  
            });  
            return convertView;  
        }  
      
        /** 
         *当用户点击按钮时触发的事件,会弹出一个确认对话框 
         */  
         public void showInfo(){    
      
                     new AlertDialog.Builder(context)    
      
                     .setTitle("我的listview")    
      
                    .setMessage("介绍...")    
      
                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {    
      
                    public void onClick(DialogInterface dialog, int which) {    
      
                         }    
      
                     })    
      
                   .show();    
      
                         
      
                }    
      
    }  

     

     

     

    废话连篇:

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

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

    第二步:获取并整理数据

    第三部:绑定数据,这里我们是通过自己编写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了。

     

  • 相关阅读:
    10月27日PHP加载类、设计模式(单例模式和工厂模式)、面向对象的六大原则
    数据解析2:JSON解析(2)
    数据解析2:JSON解析(1)
    数据解析1:XML解析(3)
    数据解析1:XML解析(2)
    数据解析1:XML解析(1)
    设计模式4:装饰模式(1)
    设计模式3:模板模式(1)
    设计模式2:工程模式(1)
    设计模式1:单例模式(1)
  • 原文地址:https://www.cnblogs.com/gzggyy/p/2472116.html
Copyright © 2020-2023  润新知