zoukankan      html  css  js  c++  java
  • Android开发:自定义GridView/ListView数据源

    http://mobile.51cto.com/android-259861.htm

    在开发中,我们常常会遇到比较复杂的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<Map<String,Object>> list;  
    4.     private LayoutInflater mInflater;  
    5.     public MyAdapter(Context context,List<Map<String,Object>> 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<Map<String,Object>> 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<Map<String,Object>>();  
    17.         Map<String,Object> map;  
    18.         map=new HashMap<String,Object>();  
    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<String,Object>();  
    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<String,Object>();  
    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. <?xml version="1.0" encoding="utf-8"?> 
    2. <LinearLayout 
    3.   xmlns:android="http://schemas.android.com/apk/res/android" 
    4.   android:layout_width="wrap_content" 
    5.   android:layout_height="wrap_content" 
    6.   android:orientation="vertical" 
    7.  android:gravity="center"> 
    8.       <ImageButton android:id="@+id/ib" 
    9.          android:layout_width="60dip" 
    10.  android:layout_height="60dip"> 
    11. </ImageButton> 
    12. </LinearLayout> 

    4、Main.xml

    1. <?xml version="1.0" encoding="utf-8"?> 
    2. <LinearLayout 
    3.    
    4. xmlns:android="http://schemas.android.com/apk/res/android" 
    5.     android:orientation="horizontal" 
    6.     android:layout_width="fill_parent" 
    7.     android:layout_height="fill_parent" 
    8.     > 
    9. <GridView android:id="@+id/gvtest" 
    10.      android:layout_width="fill_parent" 
    11.  android:layout_height="wrap_content" 
    12.     android:numColumns="3" 
    13.  android:stretchMode="columnWidth" 
    14.     android:gravity="center" 
    15.  android:layout_gravity="center_horizontal"> 
    16. </GridView> 
    17. </LinearLayout> 

    【编辑推荐】

    1. Android用户界面设计:框架布局
    2. Android用户界面设计:相对布局
    3. Android用户界面设计:线性布局
    4. Android设计趋势分析10则
    5. Android游戏开发:如何实现爆炸效果
    【责任编辑:小野 TEL:(010)68476606】
  • 相关阅读:
    web.xml中openEntityManagerInViewFilter的作用(转)
    JNDI解读(转)
    Java读取大文件的高效率实现
    快速入门react
    谈一谈我所了解的https
    漫谈JWT
    Java 中的几种线程池这么用才是对的
    用Vue来实现图片上传多种方式
    一个页面从输入URL到页面加载显示完成,这个过程都发生什么?
    “===”与“==”的区别
  • 原文地址:https://www.cnblogs.com/daishuguang/p/3700479.html
Copyright © 2011-2022 走看看