android下BaseAdapter的使用

  这段时间写了一个ListView,并且该ListView里面的每一项都需要有一个按钮且点击按钮会响应相应的操作。以前写ListView的时候都是直接用ArrayAdapter或者SimpleAdapter,但是这次这次因为有一个按钮需要响应就不能这么做了。所以需要自己写一个继承自BaseAdapter的类。

  这是我写的类:

 

    class MyAdapter extends BaseAdapter
    {
     private Context context;
     private LayoutInflater inflater;
     private int layoutID;
     private int imageResources[];
     private int buttonResources[];
     private List<HashMap<String,int[]>> list;
     private String flags[];
     private int itemIDs[];
     class Holder
     {
      ImageView image;
      ImageButton button;
     }
     
     
     public MyAdapter(Context context,int layoutID , List<HashMap<String,int[]>> list, String[] flag , int[] itemIDs)
     {
      super();
      this.context=context;
      this.layoutID=layoutID;
      this.list=list;
      this.flags=flags;
      this.itemIDs=itemIDs;
     }
  @Override
  public int getCount() {
   // TODO Auto-generated method stub
   return list.size();
  }

  @Override
  public Object getItem(int arg0) {
   // TODO Auto-generated method stub
   return null;
  }

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

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
   // TODO Auto-generated method stub
   Holder holder=new Holder();
   if(convertView==null)
   {
    //this.inflater=LayoutInflater.from(context);
    //this.inflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.inflater=getLayoutInflater();
    convertView=inflater.inflate(layoutID, null);
    holder.image=(ImageView)convertView.findViewById(R.id.iv_image);
    holder.button=(ImageButton)convertView.findViewById(R.id.btn_take);
    convertView.setTag(holder);
   }
   else
    holder=(Holder)convertView.getTag();
   
   
   int resources[]=this.list.get(position).get("resource");
   holder.image.setImageDrawable(context.getResources().getDrawable(resources[0]));
   final int pos=position;
   holder.button.setOnClickListener(new OnClickListener()
   {
    @Override
    public void onClick(View v) {
     //String str=String.format("%d", position);
     // TODO Auto-generated method stub
     Toast.makeText(context, ""+pos, Toast.LENGTH_SHORT).show();
    }
    
   });
   return convertView;
  }
     
    }

BaseAdapter类是一个最基本的适配器,用于连接ListView Spinner等控件与数据。如果要重写一个BaseAdapter,有几个方法是必须要重写的:  public int getCount()  public Object getItem(int arg0) public Object getItemID(int arg0)   public View getView(int position, View convertView,
ViewGroup parent),其中最重要的就是getCount()和getView()这两个函数。  至于像构造函数和类里面的其他变量则是根据自己具体的需要来设定的。

  在ListView中显示每一项的内容的过程是这样的:

  首先调用getCount()函数得到一共要显示多少行。如果这个函数return 0,那就会一行都不显示。而至于每一行具体显示什么内容则是通过getView函数来实现的。

      public View getView(int position, View convertView, ViewGroup parent) 

  1. /** 
  2.      * 这个方法getView(),是用来逐一绘制每一条item 
  3.      *       *  
  4.      * @param position      position就是位置从0开始 
  5.      * @param convertView   convertView是Spinner,ListView中每一项要显示的view 
  6.      * @param parent        parent就是父窗体了,也就是Spinner,ListView,GridView了 
  7.      * @return              通常return 的view也就是convertView 

  convertView就是我们最后要显示的每一项里面内容,如果convertView是第一次绘制,为一个null值,那么我们需要通过LayoutInflater将xml文件里面的布局导入到convertView中。只是convertView=inflater.inflate(layoutID, null);这句为什么第二个参数必须是null不然就会崩,这一点我始终没有搞清楚。有知道的大虾麻烦给我解解惑。

  接下来我们就将控件与对应的ID绑定起来。最后通过setTag()把将我们自己设定的Holder类与convertView绑定起来。

  如果我们不是第一次绘制,这是converView不是null,那我们可以直接调用getTag()函数将其与我们设定的Holder类绑定起来。

  绑定好之后,我们就可以对这些具体的控件进行具体的处理了。包括给ImageView设置图像啊,给Button写响应函数之类的啊。

  看到这里,如果是第一次遇到这个问题的同学可能对代码中Holder类和getTag() setTag()两个函数不太理解,其实特别简单。

  Holder这个类其实就是我们将ListView里面每一项的控件全部封装起来,而这么做的原因就是因为setTag就是将每一项里面的全部控件全部写入到convertView中去,这样每一项的内容才能显示(inflate函数只是将对应的xml载入到view中,但没有显示出来,要显示出来必须要用setTag函数)。而getTag()就返回的是convertView里面的全部控件内容,其返回值是一个Object对象,只要将这个返回值赋值给一个Holder我们就可以方便的对这些控件进行设置了。

时间: 2024-08-01 23:29:34

android下BaseAdapter的使用的相关文章

Android中BaseAdapter的用法分析与理解

本文实例分析了Android中BaseAdapter的用法.分享给大家供大家参考,具体如下: 最近做一个项目,项目中用到了ListView,ListView最重要的就是绑定数据,这个数据由Adapter来提供,这里我重写了BaseAdapter这个类来实现自己的menuAdapter代码如下: package org.leepood.lanorder; import java.io.InputStream; import java.util.ArrayList; import java.util

Android下拉框PopupWindow使用详解

本文实例为大家分享了Android下拉框PopupWindow展示的具体代码,供大家参考,具体内容如下 activity_main.xml布局 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_paren

布局-android 下拉刷新的实现类

问题描述 android 下拉刷新的实现类 求下拉刷新的实现(刷新的主体不单单是listview一种的,而是包含了图片,listvew等组合在一起的),怎么实现啊,求源码 解决方案 需求:项目中的消息列表界面要求实现类似sina微博的下拉刷新:思路:一般的消息列表为ListView类型,将list加载到adapter中,再将adapter加载到ListView中,从而实现消息列表的展示.而下拉刷新要求给消息列表加一个头部,其中有图片(向上/向下箭头)和提示字样(下拉刷新/松开刷新),从而我们需要

Android下如何使用百度地图sdk

百度地图 Android SDK是一套基于Android 2.1(v1.3.5及以前版本支持android 1.5以上系统)及以上版本设备的应用程序接口   可以使用该套 SDK开发适用于Android系统移动设备的地图应用,通过调用地图SDK接口,您可以轻松访问百度地图服务和数据,构建功能丰富.交互性强的LBS(地图类)应用程序. 百度地图Android SDK提供的所有服务是免费的,接口使用无次数限制.您需申请密钥(key)后,才可使用百度地图Android SDK.任何非营利性产品请直接使

提升Android下内存的使用意识和排查能力

     内存问题一直是大型App的开发人员比较头痛的问题,特别是像手淘这种超级的App,App中到处都是带有图片和视频的界面,而且这些功能都是由不同的团队甚至不同的事业部开发的,要整体上去管控和排查内存的问题变得相当的复杂.之前,我们多个线上版本都存在着严重的Activity等内存泄漏和不合理内存使用.这不是偶然,一个很重要的原因就是我们很多的开发测试人员侧重业务开发,忽略内存和性能,而且没有站在全局性的角度去考虑资源的使用.认为我自己的模块多缓存一些就会加快速度,以空间换时间看似正确,但是在

Android下拉刷新控件PullToRefresh实例解析_Android

Android中很多时候都会用到上下拉刷新,这是一个很常用的功能,Android的v4包中也为我们提供了一种原生的下拉刷新控件--SwipeRefreshLayout,可以用它实现一个简洁的刷新效果,但今天我们的主角并不是它,而是一个很火的第三方的上下拉刷新控件--PullToRefresh.PullToRefresh包括PullToRefreshScrollView.PullToRefreshListView.PullToRefreshGridView等等很多为我们提供的控件,我们可以在xml

Android下的CMD命令之关机重启及重启recovery_Android

Android刚兴起的时候,着实让一些小众软件火了一把,切水果,Tom猫,吹裙子就是其中的代表,当然还有实用性很强的关机重启软件,我们去百度上搜索一下. 截图: 一.了解CMD 命令 我们在cmd下进行的操作什么的,这里就不一一细说了我们只要知道下面这几条命令就可以了 重启:su -c reboot 关机:reboot -p 有了这个思路,我们就可以去实现了 activity_main.xml <LinearLayout xmlns:android="http://schemas.andr

Android下SDL2实现五子棋游戏_Android

本文实例介绍了Android下用SDL2实现一个简单的五子棋游戏,分享给大家供大家参考,具体内容如下 1. Five.c // Five.c // SDL2 五子棋 // gcc -mwindows -o Five Five.c FiveData.c FiveData.h -lSDL2 -lSDL2main -lSDL2_image -lSDL2_ttf //#define _DEBUG_ #include <stdio.h> #include <string.h> #includ

android下sqlite的blob类型不能存储超过2兆的文件

问题描述 android下sqlite的blob类型不能存储超过2兆的文件 android下sqlite的blob类型不能存储超过2兆的文件,存储1M多的文件都没问题, 超过两兆程序马上就崩溃,大家是否发现了这个情况. 解决方案 sqlite本来就是轻量级的数据库,数据库就是小数据类的存储,不然存图片,存文件 那就应该叫服务器了 解决方案二: 我有一个建议,你把图片分块存储,不要整个存入blob,取出的时候做个拼接 解决方案三: 把文件或者图片存储在文件系统中,sqlite中只存储文件的目录