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
- 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>
【编辑推荐】
Android开发:自定义GridView/ListView数据源的更多相关文章
- android 在自定义的listview(有刷新加载项)列表中,数据过少时不能铺满整个屏幕时,header和footer同时显示问题
android 在自定义的listview(有刷新加载项)列表中,数据过少时,当刷新时,加载项也会显示,这是很头疼的一个问题,查阅了一些资料,总结了一个比较不错的方法: 原来代码: @Overrid ...
- Android开发之去掉listview的点击效果,一行代码间接粗暴,解决你的问题。
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 Android开发之去掉listview的点击效果,一行代码间接粗暴,解决你的问题. 当你在用list ...
- Android开发系列之ListView
上篇博客解决了Android客户端通过WebService与服务器端程序进行交互的问题,这篇博客重点关注两个问题,一个是Android应用程序如何与本机文件型数据库SQLite进行交互,另一问题则是如 ...
- android 开发 实现一个ListView套嵌GirdView的滚动布局
效果图 实现思维: 首先要处理管理好需要导入的数据,我们这里创建class来处理这些数据并且便于管理它们. 创建一个主activity的布局,里面需要一个ListView控件. 创建一个class继承 ...
- Android开发自定义View
Android中View组件的作用类似于Swing变成中的JPanel,它只是一个空白的矩形区域,View组件中没有任何内容.对于Android应用的其他UI组件来说,它们都继承了View组件,然后在 ...
- 【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片
一. Application用途 1. Application用途 创建Application时机 : Application在启动的时候会调用Application无参的构造方法创建实例; Appl ...
- Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片
一. Application用途 1. Application用途 创建Application时机 : Application在启动的时候会调用Application无参的构造方法创建实例; Appl ...
- Android中取消GridView & ListView默认的点击背景色
方法一: gridView.setSelector(new ColorDrawable(Color.TRANSPARENT)); listView.setSelector(new ColorDrawa ...
- Android开发之适配器-ListView适配器的重复数据
适配器是Android中的数据与View视图的桥梁,作用就是将数据通过适配器显示到对应的View视图上. 工作中,在用ListView做适配器数据时候,有些人肯定碰见过,如何优化效率,但是又出现重复数 ...
随机推荐
- logfile提示stale错误解决方法
产生该错误的原因解释如下: Explanation: ============ A stale redo log file is one that Oracle believes might be i ...
- Android studio GPU Monitor :GPU Profiling needs to be enabled in the device's developer options
Android studio GPU Monitor 在真机上不能使用,提示:GPU Profiling needs to be enabled in the device's developer o ...
- 【ecos学习1】wmware运行redboot[方法一]--脚本实现配置
背景: 远程服务器Ubuntu生成软盘镜像,通过Mac下wmware运行. 1- 环境及版本: uname -a 2.6.38-8-generic #42-Ubuntu SMP Mon Apr 11 ...
- BaseActivity的定义——作为所有Activity类的父类
public abstract class BaseActivity extends AppCompatActivity implements View.OnClickListener { prote ...
- 解决Java调用Azure SDK证书错误javax.net.ssl.SSLHandshakeException
Azure作为微软的公有云平台,提供了非常丰富的SDK和API让开发人员可以非常方便的调用的各项服务,目前除了自家的.NET, Java, Python, nodeJS, Ruby,PHP等语言都提供 ...
- Performance of Transport Control Protocol over Dynamic Spectrum Access Links
2007 IEEE 这篇论文主要就是分析了几个版本的TCP协议在DSA网络中的性能问题. 得出的结论是: 大部分现在在用的几个版本的TCP协议,都是能够较好地适应DSA环境,吞吐率都能达到95%.当然 ...
- Windows去掉桌面SVN文件或文件夹问号
将版本库 的内容检出 到桌面,后才发现桌面上的文件 都变成了问号,本来也以为没有多大问题,删除 .svn 即可,可是删除所有的.svn后,桌面上还是显示问号,刷新了很多次,还重启电脑 了,问号也没有消 ...
- vmware重装系统后虚拟机实例文件*.vmdk重用
如题:vmware重装系统后自定义的:虚拟机名称*.vmdk文件重用. 一.问题描述 系统磁盘坏道,装不上系统直接换了硬盘,但是新装的Vmware不能够通过open方式打开“自定义*.vmdk”(这个 ...
- UML_交互图
交互图(Interaction Diagram)用来描述系统中的对象是如何进行相互作用的.即一组对象是如何进行消息传递的. 当交互图建模时,通常既包括对象(每个对象都扮演某一特定的角色),又包括消息( ...
- poj 1273 Drainage Ditches_最大流模版
#include <iostream> #include<cstdio> #include<queue> #include<cstring> using ...