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. }
  52. }

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. }
  54. }

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. 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. <GridView android:id="@+id/gvtest"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:numColumns="3"
  12. android:stretchMode="columnWidth"
  13. android:gravity="center"
  14. android:layout_gravity="center_horizontal">
  15. </GridView>
  16. </LinearLayout>

【编辑推荐】

  1. Android用户界面设计:框架布局
  2. Android用户界面设计:相对布局
  3. Android用户界面设计:线性布局
  4. Android设计趋势分析10则
  5. Android游戏开发:如何实现爆炸效果
【责任编辑:小野 TEL:(010)68476606】

Android开发:自定义GridView/ListView数据源的更多相关文章

  1. android 在自定义的listview(有刷新加载项)列表中,数据过少时不能铺满整个屏幕时,header和footer同时显示问题

    android  在自定义的listview(有刷新加载项)列表中,数据过少时,当刷新时,加载项也会显示,这是很头疼的一个问题,查阅了一些资料,总结了一个比较不错的方法: 原来代码: @Overrid ...

  2. Android开发之去掉listview的点击效果,一行代码间接粗暴,解决你的问题。

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 Android开发之去掉listview的点击效果,一行代码间接粗暴,解决你的问题. 当你在用list ...

  3. Android开发系列之ListView

    上篇博客解决了Android客户端通过WebService与服务器端程序进行交互的问题,这篇博客重点关注两个问题,一个是Android应用程序如何与本机文件型数据库SQLite进行交互,另一问题则是如 ...

  4. android 开发 实现一个ListView套嵌GirdView的滚动布局

    效果图 实现思维: 首先要处理管理好需要导入的数据,我们这里创建class来处理这些数据并且便于管理它们. 创建一个主activity的布局,里面需要一个ListView控件. 创建一个class继承 ...

  5. Android开发自定义View

    Android中View组件的作用类似于Swing变成中的JPanel,它只是一个空白的矩形区域,View组件中没有任何内容.对于Android应用的其他UI组件来说,它们都继承了View组件,然后在 ...

  6. 【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片

    一. Application用途 1. Application用途 创建Application时机 : Application在启动的时候会调用Application无参的构造方法创建实例; Appl ...

  7. Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片

    一. Application用途 1. Application用途 创建Application时机 : Application在启动的时候会调用Application无参的构造方法创建实例; Appl ...

  8. Android中取消GridView & ListView默认的点击背景色

    方法一: gridView.setSelector(new ColorDrawable(Color.TRANSPARENT)); listView.setSelector(new ColorDrawa ...

  9. Android开发之适配器-ListView适配器的重复数据

    适配器是Android中的数据与View视图的桥梁,作用就是将数据通过适配器显示到对应的View视图上. 工作中,在用ListView做适配器数据时候,有些人肯定碰见过,如何优化效率,但是又出现重复数 ...

随机推荐

  1. js 打开新页面 window.open()

    利用js打开一个新页面,而不是一个新窗口. 在网上各种东西啊,蛋疼了半天,还白疼了.. 后来看到a标签有target属性,然后又发现window.open()的第二个参数是target,然后我笑了(e ...

  2. javascript模拟html title

    这只是个学习原生javascript过程中的一个练手效果 不做说明解释 直接上代码 算是个参考 <!doctype html> <html> <head> < ...

  3. Django 1.6 基于类的通用视图

    Django 1.6 基于类的通用视图 最初 django 的视图都是用函数实现的,后来开发出一些通用视图函数,以取代某些常见的重复性代码.通用视图就像是一些封装好的处理器,使用它们的时候只须要给出特 ...

  4. Ubuntu系统下创建python数据挖掘虚拟环境

    虚拟环境:   虚拟环境是用于创建独立的python环境,允许我们使用不同的python模块和版本,而不混淆.   让我们了解一下产品研发过程中虚拟环境的必要性,在python项目中,显然经常要使用不 ...

  5. 观察者模式模拟YUI事件机制

    首先介绍下YUI的事件机制,很好理解,因为和浏览器事件机制差不多.看懂下面几个方法就可以了: publish: 创建自定义事件.第一个参数是事件类型,第二个参数是一个对象,里面可以设置默认动作 on: ...

  6. activity 的返回按钮

    http://www.2cto.com/kf/201210/160251.html 连续点击两次程序就退出程序,这是一个很有趣的程序功能,下来介绍一下我的实现方式(欢迎大家拍砖指点):   1.在Ac ...

  7. USB学习小记-HID类键盘的报告描述符的理解

    前言 断断续续的学习了将近三个月,才把USB的HID类搞明白,速度真是够慢的.利用晚上+周末的时间学习自己的东西确实是必要的,不过效率是有点低,以后要更专注一些才行,希望自己能做到吧. 在学习过程中, ...

  8. (十)boost库之多线程

    (十)boost库之多线程 1.创建线程 使用boost库可以方便的创建一个线程,并提供最多支持9个参数的线程函数,相对于void*来说,方便了很多,创建线程主要提供了一下3种方式: 线程库头文件:# ...

  9. 简单Demo的用户登录JSP界面IE、Firefox(chrome) Enter 键提交表单

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  10. [转]中英文停止词表(stopword)

    停止词,是由英文单词:stopword翻译过来的,原来在英语里面会遇到很多a,the,or等使用频率很多的字或词,常为冠词.介词.副词或连词等.如果搜索引擎要将这些词都索引的话,那么几乎每个网站都会被 ...