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>

	@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。请评论留下邮箱

时间: 2024-10-11 03:51:38

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

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

最近因为一个项目的原因需要自定义一个BaseAdapter实现ListVIew单选打勾的功能,虽然听起来很简单,我在网上也 看过一些例子,似乎是实现了,但往往存在一些漏洞.往往漏洞如下 1.网上例子item较少,item增多时漏洞出现,忽略了BaseAdapter中getView()方法中convertView重用的问题 2.忽略了BaseAdapter中getView()方法并不是一下子加载完所有item,上下拖动listview时item会重新加载,getview会重新被调用,所以上下拖动的

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

大三学生一个,喜欢编程,喜欢谷歌,喜欢Android,所以选择的方向自然是Android应用开发,开博第一篇,希望以后会有更多的进步. 最近在做一个记账App的时候,需要一个Activity来显示每个月的消费各个项目的比例,Activity中主要用到一个ListView,ListView中包括一个TextView来显示类型的名称,一个TextView来显示所占比例,一个ProgressBar来显示进度条,让每个条目的比例更加清晰.如下图(这里只提供实现方法,界面效果暂不提供) 因为这种效果比较特

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

原文网址:http://blog.csdn.net/checkin001/article/details/11519131 Android自带的RadioButton单选框只支持添加文字,我们自己写Adapter实现自定义的RadioButton 首先item的XML源码 search_user_item.xml (现在只是文字+单选按钮+自定义背景,可以根据需要随意扩展) [html] view plaincopy <?xml version="1.0" encoding=&q

Android ListView理解之BaseAdapter

ListView是Android开发过程中较为常见的组件之一,它将数据以列表的形式展现出来.一般而言,一个ListView由以下三个元素组 成: 1.View,用于展示列表,通常是一个xml所指定的.大家都知道Android的界面基本上是由xml文件负责完成的,所以ListView的界 面也理所应当的使用了xml定义.例如在ListView中经常用到的“android.R.layout.simple_list_item_1”等, 就是Android系统内部定义好的一个xml文件. 2.适配器,用

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

有时候我们需要制作自定义的单选列表,但是会遇到一些问题,比如多选,假选问题,所以网上找了找资料,整理一个demo出来,贴一下代码: <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerHorizontal="true&qu

ListView与CheckBox组合实现单选

main.xml配置文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"

Listview之优化BaseAdapter中的getView中的contentView

BaseAdapter中getView中改动的地方: @Override public View getView(int position, View contentView, ViewGroup arg2) { TextView textview; ImageView imageView; //判断contentView是否为空,为空重新创建 if(contentView == null){ contentView =layoutInflater.inflate(R.layout.list_i

Androi:ListView+GridView实现仿微信微博朋友圈无焦点冲突

这几天还是在做那个项目 有一个部分是需要有一个类似微信朋友圈那样的功能 开始自己实现是用RecycleView嵌套RecycleView 然后已经把别的弄好了 动态图片那块还没有加上结果我不会搞也没有找到栗子 然后就换了一个思路 看到有listview+gridview的栗子就照着做了一个 先看一下现在的效果 呐 这个是listview嵌套Gridview实现的 评论那些我在recycleview里面做好了之后再加 觉得 把这个嵌套弄好了真是超级开心呐: 嗯 就再回顾一下说一下思路: 1 lis

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

首先定义方法 1 public class Dy { 2 public int Add(int x,int y){ //定义Add(),该方法没有被static修饰 3 return x+y; 4 } 5 public static int Sub(int x,int y){//定义Sub(),该方法被static修饰 6 return x-y; 7 } 8 } 调用方法 1 public class Test { 2 public static void main(String[] args)