`
fulerbakesi
  • 浏览: 561600 次
文章分类
社区版块
存档分类
最新评论

自定义GridView/ListView数据源

 
阅读更多

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

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

1、MyAdapter.java继承自BaseAdapter

public class MyAdapter extends BaseAdapter{
    
    private Context context;
    private List<Map<String,Object>> list;
    private LayoutInflater mInflater;
    public MyAdapter(Context context,List<Map<String,Object>> list){
        this.context=context;
        this.list=list;
        mInflater=LayoutInflater.from(this.context);
    }
    public int getCount() {
        // TODO Auto-generated method stub
        if(list!=null)
            return list.size();
        else
            return 0;
    }

    public Object getItem(int position) {
        // TODO Auto-generated method stub
        if(list!=null)
            return list.get(position);
        else
            return null;
    }

    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @SuppressWarnings("unused")
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        ViewHolder holder=null;
        if(holder==null){
            holder=new ViewHolder();
            convertView=mInflater.inflate(R.layout.gridview_item, null);
            holder.ib=(ImageButton)convertView.findViewById(R.id.ib);
            convertView.setTag(holder);
        }else{
            holder=(ViewHolder)convertView.getTag();
        }
        //绑定点击事件
        holder.ib.setOnClickListener((OnClickListener) list.get(position).get("listen"));
        //通过标志位控制按钮的Enable
        if(Boolean.parseBoolean(list.get(position).get("bl").toString()))
            holder.ib.setEnabled(true);
        else
            holder.ib.setEnabled(false);
        holder.ib.setImageResource(Integer.parseInt(list.get(position).get("icon").toString()));
        return convertView;
    }
    public final class ViewHolder{
        public ImageButton ib;
    }
}

2、绑定数据源

public class Main extends Activity {
    /** Called when the activity is first created. */
    private GridView gvtest;
    private List<Map<String,Object>> list;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        findView();
    }
    
    /*
     * 定义一个标志位bl控制按钮的Enable,同时为了让每个按钮都绑定自有的点击事件提前在数据源中间各自的事件实现
     */
    private void findView(){
        gvtest=(GridView)findViewById(R.id.gvtest);
        list=new ArrayList<Map<String,Object>>();
        Map<String,Object> map;
        map=new HashMap<String,Object>();
        map.put("bl", true);
        map.put("icon", R.drawable.menu_home_dis);
        View.OnClickListener abenClick=new View.OnClickListener() {
            
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(Main.this, "You click home menu", Toast.LENGTH_SHORT).show();
            }
        };
        map.put("listen", abenClick);
        list.add(map);
        map=new HashMap<String,Object>();
        map.put("bl", true);
        map.put("icon", R.drawable.menu_backward_dis);
        View.OnClickListener beanClick=new View.OnClickListener() {
            
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(Main.this, "You click back menu", Toast.LENGTH_SHORT).show();
            }
        };
        map.put("listen", beanClick);
        list.add(map);
        map=new HashMap<String,Object>();
        map.put("bl", false);
        map.put("icon", R.drawable.menu_forward_dis);
        View.OnClickListener weiboClick=new View.OnClickListener() {
            
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(Main.this, "You click forward menu", Toast.LENGTH_SHORT).show();
            }
        };
        map.put("listen", weiboClick);
        list.add(map);
        
        MyAdapter adapter=new MyAdapter(this, list);
        gvtest.setAdapter(adapter);
    }
}
3、gridview_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:orientation="vertical" android:gravity="center">
  
    <ImageButton android:id="@+id/ib" 
        android:layout_width="60dip" android:layout_height="60dip"></ImageButton>
</LinearLayout>
4、Main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

<GridView android:id="@+id/gvtest" 
    android:layout_width="fill_parent" android:layout_height="wrap_content"
    android:numColumns="3" android:stretchMode="columnWidth"
    android:gravity="center" android:layout_gravity="center_horizontal"></GridView>
</LinearLayout>




分享到:
评论
1 楼 winchun323 2012-07-16  
博主,把这个项目上传来供下载吧。谢谢!

相关推荐

    android控件ListView. GridView.gallery应用

    GridView添加数据源和ListView也是SimpleAdpater 在数据源适配器知识点上面,我们可以自己定义一个数据源适配器,要继承BaseAdapter,实现getView的方法 画廊控件:gallery imageswitch HorizontalScrollView,在一个...

    Android程序技术:网格视图.pptx

    GridView 跟ListView 很类似,Listview 主要以列表形式显示数据,GridView 则是以网格形式显示数据。 GridView主要通过使用自定义BaseAdapter 来适配数据,进而显示到GridView中,步骤如下: 1. 准备数据源 list = ...

    Android仿微信发朋友圈浏览图片效果

    自定义适配器(ListView嵌套着GridView) 3.图片点击浏览图片(Fragment+ViewPager) 具体实现 1.初始化数据源,设置适配器,看一下代码: public class MyActivity extends Activity { /*图片显示列表*/ ...

    ASP.NET 数据绑定详解 代码+步骤

    使用GridView控件绑定数据源3.2.3. 自定义GridView控件的列字段名3.2.4. 使用GridView控件分页显示数据3.2.5. 选中、编辑和删除GridView数据项3.3. DataList 控件3.3.1. DataList 模板3.3.2. 分页显示DataList控件...

    第7章 数据绑定控件

    实例215 GridView数据源为空时显示表头和 提示信息 341 实例216 创建表头固定、表体可滚动的 GridView控件 342 实例217 可拖动列、可排序、可改变宽度的 GridView控件 344 实例218 使用“…”优化GridView控件中的 ...

    安卓源码包android web应用OCR图像识别listview相关EditText输入框Launcher 桌面45个合集

    [四次元]单排显示gridview并从解析JSON读取数据加载项目.zip [四次元]双列关联listview.rar [四次元]基于JBox2D的Android游戏开发全源码.zip [四次元]安卓桌面应用EyeRoom.zip [四次元]实现列表多选的DEMO.zip [四次...

    总结Visual Studio下ASP.NET模板化控件中的数据绑定

    此外,您还可以将模板与 GridView 和 DetailsView 控件一同使用,以自定义数据布局。 通过将模板化控件的 DataSourceID 属性设置为数据源控件的 ID,可以将模板化控件绑定到数据源控件(例如 LinqDataSource、...

    ASP.NET 控件的使用

    14.2.2 使用DataPager控件进行数据源分页 459 14.3 小结 461 第四部分 创建组件 第15章 创建组件 464 15.1 创建基本组件 464 15.1.1 组件和动态编译 466 15.1.2 App_Code文件夹中不同语言的组件 466 15.1.3 声明...

    ASP.NET.4揭秘

    14.2.2 使用datapager控件进行数据源分页526 14.3 小结527 第15章 使用chart控件528 15.1 chart控件的基础知识528 15.1.1 使用chart控件显示数据528 15.1.2 排序和过滤数据532 15.1.3 统计公式534 15.2 定制图表的...

    ASP.NET4高级程序设计(第4版) 3/3

    11.3.4 使用数据源控件的缓存 376 11.4 缓存依赖 379 11.4.1 文件和缓存项目依赖 379 11.4.2 聚合依赖 380 11.4.3 移除项目回调 381 11.4.4 理解SQL缓存通知 383 11.4.5 缓存通知的工作方式 384 ...

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    11.3.4 使用数据源控件的缓存 11.4 缓存依赖 11.4.1 文件和缓存项目依赖 11.4.2 聚合依赖 11.4.3 移除项目回调 11.4.4 理解SQL缓存通知 11.4.5 缓存通知的工作方式 11.4.6 启用通知 11.4.7 创建...

    ASP.NET3.5从入门到精通

    8.1.2 Access 数据源控件(AccessDataSource) 8.1.3 目标数据源控件(ObjectDataSource) 8.1.4 LINQ 数据源控件(LinqDataSource) 8.1.5 Xml 数据源控件(XmlDataSource) 8.1.6 站点导航控件(SiteMapDataSource...

    ASP.NET 3.5 开发大全11-15

    8.1.2 Access数据源控件(AccessDataSource) 8.1.3 目标数据源控件(ObjectDataSource) 8.1.4 LINQ数据源控件(LinqDataSource) 8.1.5 Xml数据源控件(XmlDataSource) 8.1.6 站点导航控件(SiteMapDataSource) ...

    ASP.NET 3.5 开发大全

    8.1.2 Access数据源控件(AccessDataSource) 8.1.3 目标数据源控件(ObjectDataSource) 8.1.4 LINQ数据源控件(LinqDataSource) 8.1.5 Xml数据源控件(XmlDataSource) 8.1.6 站点导航控件(SiteMapDataSource) ...

    ASP.NET 3.5 开发大全1-5

    8.1.2 Access数据源控件(AccessDataSource) 8.1.3 目标数据源控件(ObjectDataSource) 8.1.4 LINQ数据源控件(LinqDataSource) 8.1.5 Xml数据源控件(XmlDataSource) 8.1.6 站点导航控件(SiteMapDataSource) ...

    ASP.NET 3.5 开发大全word课件

    8.1.2 Access数据源控件(AccessDataSource) 8.1.3 目标数据源控件(ObjectDataSource) 8.1.4 LINQ数据源控件(LinqDataSource) 8.1.5 Xml数据源控件(XmlDataSource) 8.1.6 站点导航控件(SiteMapDataSource) ...

    ASPNET35开发大全第一章

    8.1.2 Access数据源控件(AccessDataSource) 8.1.3 目标数据源控件(ObjectDataSource) 8.1.4 LINQ数据源控件(LinqDataSource) 8.1.5 Xml数据源控件(XmlDataSource) 8.1.6 站点导航控件(SiteMapDataSource) ...

    免费DataGridView打印及.NET轻松打印控件5.0版

    报表模板设计组件EasyReport与WebEasyReport组件可以设计普通报表、分组报表、套打模板等,分别以DataGridView和GridView为数据源。控件的位置以毫米为计量单位,定位准确,很适合套打单据设计。 3、分组汇总打印...

    android手机安全卫士

    2.介绍了listview和gridview等控件的优化技巧,提升软件的效率 3.穿插介绍了企业开发中的bug管理,mantis的使用,自动化测试robotium的使用 ,log管理. 软件的打包,混淆,反编译和三方广告的加入等技巧。 该项目主要涵盖...

Global site tag (gtag.js) - Google Analytics