Android开发:自定义GridView/ListView数据源
创始人
2024-07-28 01:31:04
0

在开发中,我们常常会遇到比较复杂的GridView/ListView的布局,重新实现BaseAdapter不但能帮助我们实现我们想要的布局效果,并且在绑定大数据量时也不会感觉有卡壳现象。记得以前用一个ListView直接去绑定手机内的联系人Cursor(一百多号人),滑动的时候就会有卡的感觉。今天决定写个Demo是因为在项目中可能会要实现这样的一个效果:一个GridView中绑定4个ImageButton,有些按钮在特定的情况下是不可用的,也就是Enable=false;并且不同的按钮要拥有各自不同的点击事件。

实现***点好办,添加一个标志位boolean bl来控制按钮的Enable状态,实现第二点就是将View.onClickListener添加到List列表中

1、MyAdapter.java继承自BaseAdapter

  1. public class MyAdapter extends BaseAdapter{  
  2.         private Context context;  
  3.     private List> list;  
  4.     private LayoutInflater mInflater;  
  5.     public MyAdapter(Context context,List> list){  
  6.         this.context=context;  
  7.         this.list=list;  
  8.         mInflater=LayoutInflater.from(this.context);  
  9.     }  
  10.     public int getCount() {  
  11.         // TODO Auto-generated method stub  
  12.         if(list!=null)  
  13.             return list.size();  
  14.         else 
  15.             return 0;  
  16.     }  
  17.     public Object getItem(int position) {  
  18.         // TODO Auto-generated method stub  
  19.         if(list!=null)  
  20.             return list.get(position);  
  21.         else 
  22.             return null;  
  23.     }  
  24.     public long getItemId(int position) {  
  25.         // TODO Auto-generated method stub  
  26.         return position;  
  27.     }  
  28.     @SuppressWarnings("unused")  
  29.     public View getView(int position, View convertView, ViewGroup parent) {  
  30.         // TODO Auto-generated method stub        ViewHolder holder=null;  
  31.         if(holder==null){  
  32.             holder=new ViewHolder();  
  33.             convertView=mInflater.inflate(R.layout.gridview_item, null);  
  34.             holder.ib=(ImageButton)convertView.findViewById(R.id.ib);  
  35.             convertView.setTag(holder);  
  36.         }else{  
  37.             holder=(ViewHolder)convertView.getTag();  
  38.         }  
  39.         //绑定点击事件  
  40.         holder.ib.setOnClickListener((OnClickListener) list.get(position).get("listen"));  
  41.         //通过标志位控制按钮的Enable  
  42.         if(Boolean.parseBoolean(list.get(position).get("bl").toString()))  
  43.             holder.ib.setEnabled(true);  
  44.         else 
  45.             holder.ib.setEnabled(false);  
  46.         holder.ib.setImageResource(Integer.parseInt(list.get(position).get("icon").toString()));   
  47.        return convertView;  
  48.     }  
  49.     public final class ViewHolder{  
  50.         public ImageButton ib;  
  51.     }  

 

2、绑定数据源

  1. public class Main extends Activity {  
  2.     /** Called when the activity is first created. */ 
  3.     private GridView gvtest;  
  4.     private List> list;  
  5.     @Override 
  6.     public void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.main);  
  9.                 findView();  
  10.     }  
  11.         /*  
  12.      * 定义一个标志位bl控制按钮的Enable,同时为了让每个按钮都绑定自有的点击事件提前在数据源中间各自的事件实现  
  13.      */ 
  14.     private void findView(){  
  15.         gvtest=(GridView)findViewById(R.id.gvtest);  
  16.         list=new ArrayList>();  
  17.         Map map;  
  18.         map=new HashMap();  
  19.         map.put("bl", true);  
  20.         map.put("icon", R.drawable.menu_home_dis);  
  21.         View.OnClickListener abenClick=new View.OnClickListener() {  
  22.                         public void onClick(View v) {  
  23.                 // TODO Auto-generated method stub  
  24.                 Toast.makeText(Main.this, "You click home menu", Toast.LENGTH_SHORT).show();  
  25.             }  
  26.         };  
  27.         map.put("listen", abenClick);  
  28.         list.add(map);  
  29.         map=new HashMap();  
  30.         map.put("bl", true);  
  31.         map.put("icon", R.drawable.menu_backward_dis);  
  32.         View.OnClickListener beanClick=new View.OnClickListener() {  
  33.                         public void onClick(View v) {  
  34.                 // TODO Auto-generated method stub  
  35.                 Toast.makeText(Main.this, "You click back menu", Toast.LENGTH_SHORT).show();  
  36.             }  
  37.         };  
  38.         map.put("listen", beanClick);  
  39.         list.add(map);  
  40.         map=new HashMap();  
  41.         map.put("bl", false);  
  42.         map.put("icon", R.drawable.menu_forward_dis);  
  43.         View.OnClickListener weiboClick=new View.OnClickListener() {  
  44.                         public void onClick(View v) {  
  45.                 // TODO Auto-generated method stub  
  46.                 Toast.makeText(Main.this, "You click forward menu", Toast.LENGTH_SHORT).show();  
  47.             }  
  48.         };  
  49.         map.put("listen", weiboClick);  
  50.         list.add(map);  
  51.                 MyAdapter adapter=new MyAdapter(this, list);  
  52.         gvtest.setAdapter(adapter);  
  53.     }  

 

3、gridview_item.xml

  1.  
  2.   xmlns:android="http://schemas.android.com/apk/res/android" 
  3.   android:layout_width="wrap_content" 
  4.   android:layout_height="wrap_content" 
  5.   android:orientation="vertical" 
  6.  android:gravity="center"> 
  7.       
  8.          android:layout_width="60dip" 
  9.  android:layout_height="60dip"> 
  10.  
  11.  

4、Main.xml

  1.  
  2.    
  3. xmlns:android="http://schemas.android.com/apk/res/android" 
  4.     android:orientation="horizontal" 
  5.     android:layout_width="fill_parent" 
  6.     android:layout_height="fill_parent" 
  7.     > 
  8.      android:layout_width="fill_parent" 
  9.  android:layout_height="wrap_content" 
  10.     android:numColumns="3" 
  11.  android:stretchMode="columnWidth" 
  12.     android:gravity="center" 
  13.  android:layout_gravity="center_horizontal"> 
  14.  
  15.  

【编辑推荐】

  1. Android用户界面设计:框架布局
  2. Android用户界面设计:相对布局
  3. Android用户界面设计:线性布局
  4. Android设计趋势分析10则
  5. Android游戏开发:如何实现爆炸效果

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...