ListView 自己定义BaseAdapter实现单选打勾(无漏洞)

假设须要完整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

<span style="font-size:14px;"><?

xml version="1.0" encoding="utf-8"?

> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="60dp" android:background="@drawable/greywhite" > <LinearLayout android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_margin="7dp" android:orientation="vertical"> <TextView android:id="@+id/place_name" android:layout_height="wrap_content" android:layout_width="wrap_content" android:textColor="@drawable/black" android:singleLine="true" android:ellipsize="end" android:textSize="14sp" /> <TextView android:id="@+id/place_adress" android:layout_height="wrap_content" android:layout_width="wrap_content" android:textColor="@drawable/darkgrey" android:singleLine="true" android:ellipsize="end" android:textSize="12sp" android:layout_marginRight="40dp" /> </LinearLayout> <ImageView android:id="@+id/place_select" android:layout_height="25dp" android:layout_width="25dp" android:layout_alignParentRight="true" android:layout_marginRight="10dp" android:layout_centerVertical="true" /> </RelativeLayout></span>

自己定义的BaseAdapter,关键

<pre name="code" class="java"><span style="font-size:14px;">package com.vr.souhuodong.UI.Adapter;import java.util.List;import android.R.integer;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;import com.baidu.mapapi.search.core.PoiInfo;
import com.vr.souhuodong.R;public class PlaceListAdapter extends BaseAdapter {List<PoiInfo> mList;LayoutInflater mInflater;int notifyTip ;private class MyViewHolder {TextView placeName;TextView placeAddree;ImageView placeSelected;}public PlaceListAdapter(LayoutInflater mInflater , List<PoiInfo> mList) {super();this.mList = mList;this.mInflater = mInflater;notifyTip = -1 ;}/*** 设置第几个item被选择,非常关键* @param notifyTip*/
<span style="color:#ff0000;">  public void setNotifyTip(int notifyTip) {this.notifyTip = notifyTip;}</span>@Overridepublic int getCount() {// TODO Auto-generated method stubreturn mList.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn mList.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubMyViewHolder holder;if (convertView == null) {System.out.println("----aa-");convertView = mInflater.inflate(com.vr.souhuodong.R.layout.listitem_place, parent, false);        holder = new MyViewHolder();holder.placeName = (TextView) convertView.findViewById(com.vr.souhuodong.R.id.place_name);holder.placeAddree = (TextView) convertView.findViewById(com.vr.souhuodong.R.id.place_adress);holder.placeSelected = (ImageView) convertView.findViewById(com.vr.souhuodong.R.id.place_select);holder.placeName.setText(mList.get(position).name);holder.placeAddree.setText(mList.get(position).address);holder.placeSelected.setBackgroundResource(R.drawable.greywhite);convertView.setTag(holder);} else {holder = (MyViewHolder) convertView.getTag();          }holder.placeName.setText(mList.get(position).name);holder.placeAddree.setText(mList.get(position).address);<span style="color:#ff0000;">//依据又一次载入的时候第position条item是否是当前所选择的。选择载入不同的图片。图片是打勾图片if(notifyTip == position ){            holder.placeSelected.setBackgroundResource(R.drawable.ic_select);//打勾图片}            else {holder.placeSelected.setBackgroundResource(R.drawable.greywhite);//未打勾图片}</span>return convertView;}}
</span>

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

<span style="font-size:14px;">     @Overridepublic void onItemClick(AdapterView<?

> parent, View view, int position, long id) { // TODO Auto-generated method stub <span style="color:#ff0000;">// 通知是适配器第position个item被选择了 mAdapter.setNotifyTip(position); // 选中项打勾 mSelectImg.setBackgroundResource(R.drawable.greywhite); mSelectImg = (ImageView) view.findViewById(R.id.place_select); mSelectImg.setBackgroundResource(R.drawable.ic_select); </span> }</span>

红色为关键

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

posted on 2017-07-21 19:08 mthoutai 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/mthoutai/p/7219276.html

ListView 自己定义BaseAdapter实现单选打勾(无漏洞)相关推荐

  1. Android中ListView与RadioButton结合----自定义单选列表

    有时候我们需要制作自定义的单选列表,但是会遇到一些问题,比如多选,假选问题,所以网上找了找资料,整理一个demo出来,贴一下代码: [html] view plaincopy <ListView ...

  2. 在ListView中使用BaseAdapter进行适配

    首先我不否认,我们可以不使用Adapter甚至是BaseAdapter来进行适配就能达到某种效果. 但是,我们的LisView的Item多了之后,可能就会导致有很多冗余.而且,你有没有想过一个问题,如 ...

  3. android 自定义baseadapter listview,Android 自定义 BaseAdapter 最佳实践

    虽然现在很多新的项目都在使用RecyclerView,但是很多开发者在一些场景中还是倾向使用ListView或者GridView,然后就是需要写许多的Adapter.一次项目组在新启动一个新项目的时候 ...

  4. android listview高级,Android 高级控件笔记-列表视图ListView 基本适配器BaseAdapter

    我最近做项目用到了基本适配器BaseAdapter,所以写篇博客总结一下,希望也能对你有所帮助 什么时候用BaseAdapter(同一项存在多个控件,复杂的列表时) Android中Adapter类其 ...

  5. html 单选打勾效果,checkbox 实现单选效果(html)

    note:在html 标签类中的checkbox实现单选效果. 在最近的开发项目中,客户要求使用小方格子实现"单选"功能,显然圆点的radio被out了,只能选择chckbox的方 ...

  6. 由于使用计算机编制会计报表,由于使用计算机编制会计报表,定义了会计报表之间的勾稽关系,可根据需要随时随意生成及输出会计报表。()...

    _ 做好消防舟艇日常维护和保养,确保性能完好,可以加强水域救援行动安全.() 单.双排扣件式钢管脚手架的一次搭设高度不应超过相邻连墙件以上( ). 根据<商业银行压力测试指引>, 以下不适 ...

  7. java 定义一个学生类,利用无参和带参方法调用

    包名展示 主函数 package Sudent;import Sudent.student;public class studentdemo {public static void main(Stri ...

  8. 你的人生你定义!享你所想,无惧冒险

    ▼关于Embracing X: 驭势成功的机会在于X,代表不确定性,代表变化,代表不可知的未来,代表更变革性的未来.所以我们鼓励冒险,奖励犯错,做10X的突破式创新. 驭势对自己的期许是"温 ...

  9. Android BaseAdapter与ListView的使用

    Android BaseAdapter与ListView的使用 定义:BaseAdapterextends Objectimplements ListAdapter SpinnerAdapter Ba ...

最新文章

  1. 2021年第十六届智能车竞赛线上决赛之前大家的提问
  2. 位图bitmap数据结构
  3. mysql七种join理论
  4. Windows 下 Python 环境搭建
  5. Transformer又又来了,生成配有音乐的丝滑3D舞蹈,开放最大规模数据集AIST++
  6. 安装和运行Maven
  7. 【财富空间】郝景芳:如何不被未来折叠
  8. 如何让自己的电脑内外网同时用?
  9. C#做的一个简易图片浏览器
  10. WordPress 安全漏洞
  11. 美团网手机客户端产品分析
  12. 在c语言中while与do-while,C语言中while /do while语句用法
  13. so文件的编译与使用
  14. 当对手有 45 亿资金、1 亿用户,你怎么办?
  15. Flare-On Challenge4 Writeup
  16. 怎么加网上的精准引流?精准引流有没有小技巧?
  17. 技术干货 | 网易云信大规模聊天室系统架构解析
  18. MD5加密js-md5
  19. java利用Date类做练习,实现倒计时30s功能
  20. Linux中使用mvn命令(使用Maven:-bash:mvn:command not fonud)随笔

热门文章

  1. C++如何调用C接口
  2. 分米波类有哪些最新发表的毕业论文呢?
  3. ScreenFlow 9.0.3 中文版 优秀的屏幕录像软件
  4. java获取几小时之前的时间_Java获取当前时间前几个小时
  5. Python mini-web框架框架开发01
  6. 使用链表(LinkedList) 二叉搜索树(BST) 实现不重复元素集合(Set)
  7. 10年资深猎头揭露:他们为什么能年薪百万
  8. java五子棋博弈,五子棋(人機對弈)——Java權值法五子棋博弈
  9. 速卖通开放平台 预约交货模块开发指南
  10. H5去掉输入框type为number时的上下箭头