假设须要完整demo,请评论留下邮箱

(眼下源代码已经不发送。假设须要源代码,加qq316701116。不喜勿扰)

近期由于一个项目的原因须要自己定义一个BaseAdapter实现ListVIew单选打勾的功能,尽管听起来非常easy,我在网上也 看过一些样例,似乎是实现了,但往往存在一些漏洞。往往漏洞例如以下

1、网上样例item较少,item增多时漏洞出现,忽略了BaseAdapter中getView()方法中convertView重用的问题

2、忽略了BaseAdapter中getView()方法并非一下子载入全然部item,上下拖动listview时item会又一次载入。getview会又一次被调用,所以上下拖动的时候漏洞出 现

3、破坏了getview()方法中的convertView重用的长处,选择每次载入,都又一次new一个convertView,尽管实现了,却大大减少了性能

综合以上,你会发现。自己定义一个合理的BaseAdapter以及重写getView()方法是实现本功能的关键所在

我们先来看看getView方法有什么奥秘

看看getVIew()方法的參数列表

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

先来解析下參数:position表示第position个item;

convertView表示一个item布局,也就是一个item的句柄

parent表示使用这个Adapter的ListView

对于getVIew的重用和优化功能,在这里我就不具体说明。由于网上这部分的博客说的非常多,并且说得还不错

假如你的手机一次性能显示10个item。那么,在第一次载入的时候。这10个item调用getVIew方法的时候,传入的參数中 convertView都是null

但当你向下拖动listview,第11个item显示而第1个item离开的时候,此时getVIew方法的调用传入的參数中 convertView就是第1个item的 convertView,这就是 convertView的重用,我们能够通过 convertView訪问item的各个控件,改动控件的text、图片等,就变成了第11个显示的item

假如item里面有一个TextView。写着当前item是第几个,那第1个item的TextVIew就写着第一。当第11个item调用getVIew的传入的 是第1个item的convertView,通过 convertView获取的TextView事实上是第1个item的TextView,我们仅仅要将 TextView的text改成第十一

上下拖动listview,仅仅会有10个 convertView实例存在。getVIew()会被重复调用,存在着

1——11——21

2——12——22

3——13——23

。。。

10——20——30

这么一个 convertView的相应关系

可參考博客http://blog.csdn.net/kaixinbingju/article/details/8650249

依照上面这个说法设计getVIew方法是合理的、高效的

有了上面的叙述。那实现 ListView 自己定义BaseAdapter实现单选打勾 功能就有了理论基础

下面是我实现该功能的核心代码

ListVitw里面item的布局文件listitem_place.xml

  1. <span style="font-size:14px;"><?
  2.  
  3. xml version="1.0" encoding="utf-8"?
  4.  
  5. >
  6. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  7. android:layout_width="match_parent"
  8. android:layout_height="60dp"
  9. android:background="@drawable/greywhite" >
  10.  
  11. <LinearLayout
  12. android:layout_height="wrap_content"
  13. android:layout_width="wrap_content"
  14. android:layout_margin="7dp"
  15. android:orientation="vertical">
  16.  
  17. <TextView
  18. android:id="@+id/place_name"
  19. android:layout_height="wrap_content"
  20. android:layout_width="wrap_content"
  21. android:textColor="@drawable/black"
  22. android:singleLine="true"
  23. android:ellipsize="end"
  24. android:textSize="14sp"
  25. />
  26. <TextView
  27. android:id="@+id/place_adress"
  28. android:layout_height="wrap_content"
  29. android:layout_width="wrap_content"
  30. android:textColor="@drawable/darkgrey"
  31. android:singleLine="true"
  32. android:ellipsize="end"
  33. android:textSize="12sp"
  34. android:layout_marginRight="40dp"
  35. />
  36. </LinearLayout>
  37.  
  38. <ImageView
  39. android:id="@+id/place_select"
  40. android:layout_height="25dp"
  41. android:layout_width="25dp"
  42. android:layout_alignParentRight="true"
  43. android:layout_marginRight="10dp"
  44. android:layout_centerVertical="true"
  45.  
  46. />
  47.  
  48. </RelativeLayout></span>

自己定义的BaseAdapter,关键

  1. <pre name="code" class="java"><span style="font-size:14px;">package com.vr.souhuodong.UI.Adapter;
  2.  
  3. import java.util.List;
  4.  
  5. import android.R.integer;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.View.OnClickListener;
  9. import android.view.ViewGroup;
  10. import android.widget.BaseAdapter;
  11. import android.widget.ImageView;
  12. import android.widget.TextView;
  13.  
  14. import com.baidu.mapapi.search.core.PoiInfo;
  15. import com.vr.souhuodong.R;
  16.  
  17. public class PlaceListAdapter extends BaseAdapter {
  18.  
  19. List<PoiInfo> mList;
  20. LayoutInflater mInflater;
  21. int notifyTip ;
  22.  
  23. private class MyViewHolder {
  24. TextView placeName;
  25. TextView placeAddree;
  26. ImageView placeSelected;
  27. }
  28.  
  29. public PlaceListAdapter(LayoutInflater mInflater , List<PoiInfo> mList) {
  30. super();
  31. this.mList = mList;
  32. this.mInflater = mInflater;
  33. notifyTip = -1 ;
  34. }
  35.  
  36. /**
  37. * 设置第几个item被选择,非常关键
  38. * @param notifyTip
  39. */
  40. <span style="color:#ff0000;"> public void setNotifyTip(int notifyTip) {
  41. this.notifyTip = notifyTip;
  42. }</span>
  43.  
  44. @Override
  45. public int getCount() {
  46. // TODO Auto-generated method stub
  47. return mList.size();
  48. }
  49.  
  50. @Override
  51. public Object getItem(int position) {
  52. // TODO Auto-generated method stub
  53. return mList.get(position);
  54. }
  55.  
  56. @Override
  57. public long getItemId(int position) {
  58. // TODO Auto-generated method stub
  59. return position;
  60. }
  61.  
  62. @Override
  63. public View getView(int position, View convertView, ViewGroup parent) {
  64. // TODO Auto-generated method stub
  65. MyViewHolder holder;
  66. if (convertView == null) {
  67. System.out.println("----aa-");
  68. convertView = mInflater.inflate(com.vr.souhuodong.R.layout.listitem_place, parent, false);
  69. holder = new MyViewHolder();
  70. holder.placeName = (TextView) convertView
  71. .findViewById(com.vr.souhuodong.R.id.place_name);
  72. holder.placeAddree = (TextView) convertView
  73. .findViewById(com.vr.souhuodong.R.id.place_adress);
  74. holder.placeSelected = (ImageView) convertView
  75. .findViewById(com.vr.souhuodong.R.id.place_select);
  76. holder.placeName.setText(mList.get(position).name);
  77. holder.placeAddree.setText(mList.get(position).address);
  78. holder.placeSelected.setBackgroundResource(R.drawable.greywhite);
  79. convertView.setTag(holder);
  80. } else {
  81. holder = (MyViewHolder) convertView.getTag();
  82. }
  83. holder.placeName.setText(mList.get(position).name);
  84. holder.placeAddree.setText(mList.get(position).address);
  85. <span style="color:#ff0000;">//依据又一次载入的时候第position条item是否是当前所选择的。选择载入不同的图片。图片是打勾图片
  86. if(notifyTip == position ){
  87. holder.placeSelected.setBackgroundResource(R.drawable.ic_select);//打勾图片
  88. }
  89. else {
  90. holder.placeSelected.setBackgroundResource(R.drawable.greywhite);//未打勾图片
  91. }</span>
  92.  
  93. return convertView;
  94. }
  95.  
  96. }
  97. </span>
  1.  

ListView的OnitemClickListenr监听器的Onlick()回调函数

  1. <span style="font-size:14px;"> @Override
  2. public void onItemClick(AdapterView<?
  3.  
  4. > parent, View view, int position,
  5. long id) {
  6. // TODO Auto-generated method stub
  7.  
  8. <span style="color:#ff0000;">// 通知是适配器第position个item被选择了
  9. mAdapter.setNotifyTip(position);
  10.  
  11. // 选中项打勾
  12. mSelectImg.setBackgroundResource(R.drawable.greywhite);
  13. mSelectImg = (ImageView) view.findViewById(R.id.place_select);
  14. mSelectImg.setBackgroundResource(R.drawable.ic_select);
  15. </span>
  16. }</span>

红色为关键

以上就是所有内容,假设有什么疑问能够评论回复,假设希望完整demo。请评论留下邮箱

ListView 自己定义BaseAdapter实现单选打勾(无漏洞)的更多相关文章

  1. Android开发学习之路-自定义ListView(继承BaseAdapter)

    大三学生一个,喜欢编程,喜欢谷歌,喜欢Android,所以选择的方向自然是Android应用开发,开博第一篇,希望以后会有更多的进步. 最近在做一个记账App的时候,需要一个Activity来显示每个 ...

  2. 【转】ListView与RadioButton组合——自定义单选列表

    原文网址:http://blog.csdn.net/checkin001/article/details/11519131 Android自带的RadioButton单选框只支持添加文字,我们自己写A ...

  3. ListView与RadioButton组合——自定义单选列表

      标签: radiobuttonlistviewandroidlayout 2013-09-10 11:13 19396人阅读 评论(8) 收藏 举报  分类: Android(19)  版权声明: ...

  4. Android ListView理解之BaseAdapter

    ListView是Android开发过程中较为常见的组件之一,它将数据以列表的形式展现出来.一般而言,一个ListView由以下三个元素组 成: 1.View,用于展示列表,通常是一个xml所指定的. ...

  5. ListView与CheckBox组合实现单选

    main.xml配置文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns ...

  6. Android基础控件ListView和自定义BaseAdapter适配器

    1.简介 ListView用于列表显示,相当于OC中的TableView,和适配器一块使用,相关属性: footerDividersEnabled:是否在footerView(表尾)前绘制一个分隔条, ...

  7. Listview之优化BaseAdapter中的getView中的contentView

    BaseAdapter中getView中改动的地方: @Override public View getView(int position, View contentView, ViewGroup a ...

  8. Java调用外部类定义的方法(Static与无Static两种)

    首先定义方法 public class Dy { public int Add(int x,int y){ //定义Add(),该方法没有被static修饰 return x+y; } public ...

  9. Android ListView使用BaseAdapter与ListView的优化 (转至 http://www.open-open.com/lib/view/open1339485728006.html)

    在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作.也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点.读者可 ...

随机推荐

  1. jQuery 遍历函数 ,javascript中的each遍历

    jQuery 遍历函数 jQuery 遍历函数包括了用于筛选.查找和串联元素的方法. 函数 描述 .add() 将元素添加到匹配元素的集合中. .andSelf() 把堆栈中之前的元素集添加到当前集合 ...

  2. Leetcode 472.连接词

    连接词 给定一个不含重复单词的列表,编写一个程序,返回给定单词列表中所有的连接词. 连接词的定义为:一个字符串完全是由至少两个给定数组中的单词组成的. 示例: 输入: ["cat" ...

  3. Django模板(filter过滤器{{ }}与tag标签{% %}应用)

     模板里面过滤器与标签的应用 templates模板里面的应用参考(主要应用在这里面) <!DOCTYPE html> <html lang="en"> & ...

  4. URAL 1099 Work scheduling 一般图的最大匹配 带花树算法(模板)

    R - Work scheduling Time Limit:500MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u ...

  5. BZOJ1880 [Sdoi2009]Elaxia的路线 【最短路 + dp】

    题目 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w每天都要奔波于宿舍和实验室之间,他们 希望在节约时间的前提 ...

  6. 金鹰教程网 FLASH8.0(AS)视频教程(下载地址)自认为最好的一个Flash教程

    原文发布时间为:2008-07-29 -- 来源于本人的百度文章 [由搬家工具导入] 可以用迅雷新建批量任务下载,很方便的。 金鹰教程网 FLASH8.0教学视频 到目前(2008年7月29日21:2 ...

  7. windows下webrtc的编译 2016(转)

    ====================20160124更新============================= 推荐一个FQ工具,shadowsocks,是需要付费的,一年也才不到100块,移 ...

  8. 标准C程序设计七---77

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  9. PHP错误捕获处理

    PHP错误捕获处理 一般捕获错误使用的方法是: try{ ...}catch(Exception $e){ echo $e->getMessage();} 或者 set_exception_ha ...

  10. 基于现有图像数据创建自定义像素格式的 BufferedImage

    在最近的一个项目中,需要实现 Mac OS X 环境下的摄像头图像实时捕获并转换为 Java 中的 BufferedImage 对象.首先通过开发一个本地库实现 Mac OS X 的摄像头图像捕获,采 ...