ListView通常有两个职责:

将数据填充到布局 ; 处理用户的点击选择操作

二。创建ListView需要3个元素

  ListView的每一列的View

  View的数据或者图片

  连接数据与ListView的Adapter

三。常用的适配器

Adapter

含义

ArrayAdapter<T>

用来绑定一个数组,支持泛型操作

SimpleAdapter

用来绑定在xml中定义的控件对应的数据

SimpleCursorAdapter

用来绑定游标得到的数据

BaseAdapter

通用的基础适配器

四,ArrayAdapter

代码:

String[] str=new String[]{"1","2","3"};

lv.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,str) );

五。SimpleAdapter

代码:

ArrayList<HashMap<String,Object> >  listItem=new ArrayList<HashMap<String,Object> >();

for(int i=0;i<10,i++){

    HashMap<String ,Object>  map=new HashMap<String,Object>();

      map.put("ItemImage",R.drwaable.icon);

      map.put("ItemTitle","第"+i+“行”);

      map.put("ItemText",i+"行");

      listItem,add(map);    

    }

//this,存放的数据,每一行的布局,动态数组中的数据源的键对应到布局view中

SimpleAdapter  smadapter=new SimpleAdapter(this,listItem,R.layout.item,

                  new String[]{" ItemImage","ItemTitle","ItemText"}

                  new int[]{R.id.ItemImage,R.id.ItemTitle,R.id.ItemText});

lv.setAdapter(smadapter);

主意:使用SimpleAdapter一般都是用HashMap构成的列表,列表的每一节对应LisView的每一行。通过SimpleAdapter的构造函数,将HashMap的每个键的数据映射到布局文件的控件上

六。BaseAdapter

在ListView的使用中,还需要加入按钮等空间,实现单独的操作,用SimpleAdapter无法获取焦点,点击操作会被ListView的item覆盖,所以用到来Baseadapter。

使用BaseAdapter必须写一个类来继承它,以为它是一个抽象类,重写4个方法,最重要的方法是getView();

当开始绘制ListView的时候,首先调用getCount()方法,得到它的返回值,即listView的长度;

然后调用getView()方法,根据长度逐一绘制ListView的每一行;

然后getItem()和getItemId()在需要处理和取得Adapter中的数据时调用

代码:

//创建MyApdater继承BaseAdapter

MyAdapter mAdapter=new MyAdapter(this);

lv.setAdapter(mAdapter);

lv.setOnItemClickListener(new OnItemClickListener(){

  public void onItemClick(AdapterView<?>arg0,View arg1,int arg2,long arg3){

    log.v("你点击了"+arg2);

    }

});

//方法:得到数据

private ArrayList<HashMap<String,Object> >getDate(){

  ArrayList<HashMap<String,Object> >  listItem=new  ArrayList<HashMao<String,Object> >();

  //为动态数组添加数据

  for(int i=0,i<10,i++){

      HashMap<String ,Object> map=new HashMap<String,Object>();

      map.put("ItemTitle","第"+i+"行");

      map.pt("ItemText","第'+i+"行");

      listItem.add(map);

        }

    return listItem;

}

//BaseAdapter的实体类MyAdapter

private class MyAdapter extends BaseAdpater{

  //得到一个LayoutInfalter对象来导入布局

  private LayoutInflater mInflater;

  public MyAdapter(Context context){

  this.mInflater=LayoutInflater.from(context);

  }

  // 重写的方法

  public int getCount(){

  return getDate().size();  //返回数组的长度

  }

  public Object getItem(int position){

  return null;

  }

  public long getItemId(int position){

  return 0;

  }

  //重写最重要的方法

  pubic View getView(final int position,View convertView,ViewGroup parent){

    ViewHolder holder;

    //观察convertView随listVIew的滚动情况

    Log.v("my","getView"+position+"---"+convertView);

    if(convertView==null){

        convertView=nInflater.inflate(R.layout.item,null);

        holder=new ViewHolder();

        // 实力化控件

        holder.title=(TextView)convertVIew.finViewByid(R.id.xxx);

        holder.text=(TextView)convertVIew.finViewByid(R.id.xxx);

        holder.tbutton=(Button)convertVIew.finViewByid(R.id.xxx); 

        convertView,setTag(holder);     //绑定ViewHolder对象

      }else{

        //取出ViewHolder对象,ViewHolder在下面有定义

        holder=(ViewHolder)contretView.getTag();

        //设置TextVIew显示的内容,即我们存放在动态数组中的数据

        holder.title.setText(getDate().get(position).get("ItemTitle").toString());
holder.text.setText(getDate().get(position).get("ItemText").toString()); /*为Button添加点击事件*/ holder.bt.setOnClickListener(new OnClickListener() { @Override
publicvoid onClick(View v) {
Log.v("MyListViewBase", "你点击了按钮" + position); //打印          Button的点击信息
}
});

        return convertView;

          }

  }

  //存放数据的ViewHolder

   public final class ViewHolder{

          public TextView title;      

           public TextView text; 

           public Button bt;

    }

}

主意:

代码中getView()方法不容易理解。其实完全可以不用所谓的convertView和ViewHolder,直接导入布局并且设置控件显示的内容就可以了。但是这意味着有多少行数据就需要绘制多少行ListView,这显然是不可取的。这里采用了一种优化的方法。代码中,在getView()方法中加入了一行log输出convertView的内容。

从图4-38中可以看出,当启动Activity呈现第一屏ListView的时候,convertView为零。当用户向下滚动ListView时,上面的条目变为不可见,下面出现新的条目。这时候convertView不再为空,而是创建了一系列的convertView的值。当又往下滚一屏的时候,发现第11行的容器用来容纳第22行,第12行的容器用来容纳第23行。也就是说convertView相当于一个缓存,开始为0,当有条目变为不可见,它缓存了它的数据,后面再出来的条目只需要更新数据就可以了,这样大大节省了系统资料的开销。

还可以继续优化。虽然重复利用了已经绘制的view,但是要得到其中的控件,需要在控件的容器中通过findViewById的方法来获得。如果这个容器非常复杂,这显然会增加系统资源的开销。在上面的例子中,引入了Tag的概念。或许不是最好的办法,但是它确实能使ListView变得更流畅。代码中,当convertView为空时,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象。当convertView不为空,重复利用已经创建的view的时候,使用getTag()方法获取绑定的ViewHolder对象,这样就避免了findViewById对控件的层层查询,而是快速定位到控件。

ListView的深入学习的更多相关文章

  1. Android之ListView——ArrayAdapter的学习与总结

    问题:当ListView选定的ListItem视图中存在一些UI组件,如CheckBox,希望保存状态,但实际上第一次完成时发现勾选后的选项在列表往下滑再滑回去后,状态没有保存 解决过程: 1)思考后 ...

  2. 43.Android之ListView中BaseAdapter学习

    实际开发中个人觉得用的比较多是BaseAdapter,尽管使用起来比其他适配器有些麻烦,但是使用它却能实现很多自己喜欢的列表布局,比如ListView.GridView.Gallery.Spinner ...

  3. android ListView 中getview学习总结

    最近在做android相关的开发,ListView中有一个图片错位的问题,今天查了很多人写的一些东西,所以记录下来,算是一种加深理解吧. ListView是一个非常常用的控件,功能可以扩展的很丰富,而 ...

  4. Android列表视图ListView和ListActivity-android学习之旅(二十四)

    ListView简介 ListView是android中常用的一种控件,创建ListView有两种方式: 1.在xml中使用ListView控件创建. 2.使用activity继承ListActivi ...

  5. android ListView 与GridView 学习总结(五)

    ListView的使用总结 基本使用:   步骤:在布局文件中定义一个ListView控件-在活动中获得ListView的实例-获得适配器adapter的实例并且传入三个参数-把适配器对象传递给lis ...

  6. 38.Android之ListView简单学习(一)

    android中ListView用的很普遍,今天来学习下,本篇主要以本地数据加载到listview,后面会学习从网络获取数据添加到listview. 首先改下布局文件: <?xml versio ...

  7. Android学习系列(17)--App列表之圆角ListView(续)

    http://www.cnblogs.com/qianxudetianxia/archive/2011/09/19/2068760.html   本来这篇文章想并到上篇Android学习系列(16)- ...

  8. android学习系列:jercy——AI3 的博客

    [android学习之十七]——特色功能2:桌面组件(快捷方式,实时文件夹) 二.桌面组件 1.快捷方式 Android手机上得快捷方式的意思可以以我们实际PC机器上程序的快捷方式来理解.而andro ...

  9. Android零基础入门第37节:初识ListView

    原文:Android零基础入门第37节:初识ListView 之前我们学习的一些UI组件都比较简单,但是在实际开发中,会经常遇见列表界面设计,如通讯录.电话列表.信息列表等.那么从本节开始来详细学习列 ...

随机推荐

  1. js-Ajax与Comet

    Ajax与Comet: 1.Ajax技术的核心是XHR(XMLHTTPRequest对象) 创建xhr对象: function createXHR(){ if(typeof XMLHttpReques ...

  2. hdu 4990 Reading comprehension 二分 + 快速幂

    Description Read the program below carefully then answer the question. #pragma comment(linker, " ...

  3. 遍历table指定name的td

    $("td[name='rates']").each(function () { var temp = $(this).text().substr(0,$(this).text() ...

  4. 2014-2015 ACM-ICPC, NEERC, Moscow Subregional Contest F. Friends

    F. Friends time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...

  5. 【原】iOS学习43即时通信之XMPP(2)

    本篇是 即时通信之XMPP(2) 接上次 即时通信之XMPP(1) 1. 好友列表 1> 初始化好友花名册 // 获取管理好友的单例对象 XMPPRosterCoreDataStorage *r ...

  6. iOS学习35数据处理之文件读写

    1. 沙盒机制 1> 沙盒概述 每一个iOS应用程序都会为自己创建一个文件系统目录(文件夹), 这个独立.封闭.安全的空间,叫做沙盒 注:① 每一个应用程序都会拥有一个应用程序沙盒 ② 应用程序 ...

  7. HDU5823 : color II

    每种颜色的点集肯定是独立集,因此可以通过$O(2^n)$枚举每个集合判断出每个集合是否只需要一种颜色即可染色. 设$f[i][S]$表示$i$种颜色覆盖$S$这个集合的方案数,假定两个集合可以相交,那 ...

  8. rem 产生的小数像素问题

    由于日常需求以无线居多,所以可以在业务中做一些尝试,如 rem,刚接触这个特性的时候,曾经一度爱不释手,仿佛在无线开发的坎坷路上寻找到一条捷径.然而随着使用范围的扩大,慢慢的发现了一些使用 rem 带 ...

  9. ORA-01034错误:ORALCE NOT CONNECT

    解决办法: 启动数据库 sqlplus '/as sysdba '  startup;

  10. JS中关于比较运算符的问题(a===b)

    之前也会碰到a===b和a==b的表达式,但都没有仔细的看资料,今天看canvas有关的书中提到了,就mark一下: a == b    说明:a与b相等: a ===b  说明:a与b相同,并且类型 ...