假设须要完整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> @Override
public int getCount() {
// TODO Auto-generated method stub
return mList.size();
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return mList.get(position);
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
MyViewHolder 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;">		@Override
public 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。请评论留下邮箱

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. mongodb的基本操作数据更新

    先启动服务器 查看数据库 选择数据库 删除数据库 插入信息 查看插入的表名 查看信息 修改表数据 修改指定信息,其他信息不改变 可以使不存在的命令进行修改并保存 修改多条数据 删除数据 删除表 查看集 ...

  2. GloVe词分布式表示

    GloVe 模型介绍 下面的内容主要来自https://blog.csdn.net/u014665013/article/details/79642083 GloVe的推导 GloVe是基于共现信息来 ...

  3. [python IO学习篇] [打开包含中文路径的文件]

    https://my.oschina.net/mcyang000/blog/289460   打开路径含有中文的文件时,要注意: 1 在windows对文件名编码是采用gbk等进行编码保存,所以要将文 ...

  4. 九度oj 题目1380:lucky number

    题目描述: 每个人有自己的lucky number,小A也一样.不过他的lucky number定义不一样.他认为一个序列中某些数出现的次数为n的话,都是他的lucky number.但是,现在这个序 ...

  5. 【转】UML中的几种关系详细解析

    UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现 类与类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 2) 在系统中, ...

  6. ACM程序设计选修课——1058: Lucky Sequence(思考)

    1058: Lucky Sequence Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 52  Solved: 6 [Submit][Status][ ...

  7. BZOJ4817 [Sdoi2017]树点涂色 【LCT + 线段树】

    题目 Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色.Bob可能会进行这 ...

  8. iOS-跨界面传值和跨应用传值

    跨界面传值 从一个界面将一个结果值传到另一个界面,这个是我们在开发过程中非常常见的一个问题.传值本身并不是一个太复杂的问题,在此主要简述一下常用的传值方法. 我们传值常用的方法主要有四种: 1.属性传 ...

  9. Python实现删除文件夹内规定时间内的文件

    需求:  在测试程序的时候,程序会大批量的上传文件到规定目录,然后文件根据日期DAY新建文件夹存放,比如28号上传的文件放到  .../28/* 内,29号上传的文件放到 .../29/*内,因为需要 ...

  10. configure.ac:3: error: Autoconf version 2.68 or higher is required

    configure.ac:3: error: Autoconf version 2.68 or higher is required 参考博客:https://blog.csdn.net/pretty ...