`

android中实现带图片和checkbox的listview

阅读更多
项目要用到一个listview,要求是可以显示图片,后面还有有复选框。

先新建一个MyAdapter类,继承自BaseAdapter。在MyAdapter中实现对数据的绑定,我这儿由于是测试的,所以把数据写死了。
package com.zwq.umeng;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;

public class MyAdapter extends BaseAdapter {
	private LayoutInflater mInflater;
	private List<Map<String, Object>> mData;
	public static Map<Integer, Boolean> isSelected;

	public MyAdapter(Context context) {
		mInflater = LayoutInflater.from(context);
		init();
	}

	//初始化
	private void init() {
		mData=new ArrayList<Map<String, Object>>();
		for (int i = 0; i < 5; i++) {
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("img", R.drawable.icon);
			map.put("title", "第" + (i + 1) + "行的标题");
			mData.add(map);
		}
		//这儿定义isSelected这个map是记录每个listitem的状态,初始状态全部为false。
		isSelected = new HashMap<Integer, Boolean>();
		for (int i = 0; i < mData.size(); i++) {
			isSelected.put(i, false);
		}
	}

	@Override
	public int getCount() {
		return mData.size();
	}

	@Override
	public Object getItem(int position) {
		return null;
	}

	@Override
	public long getItemId(int position) {
		return 0;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ViewHolder holder = null;
		//convertView为null的时候初始化convertView。
		if (convertView == null) {
			holder = new ViewHolder();
			convertView = mInflater.inflate(R.layout.vlist, null);
			holder.img = (ImageView) convertView.findViewById(R.id.img);
			holder.title = (TextView) convertView.findViewById(R.id.title);
			holder.cBox = (CheckBox) convertView.findViewById(R.id.cb);
			convertView.setTag(holder);
		} else {
			holder = (ViewHolder) convertView.getTag();
		}
		holder.img.setBackgroundResource((Integer) mData.get(position).get(
				"img"));
		holder.title.setText(mData.get(position).get("title").toString());
		holder.cBox.setChecked(isSelected.get(position));
		return convertView;
	}

	public final class ViewHolder {
		public ImageView img;
		public TextView title;
		public CheckBox cBox;
	}
}

上面类中要注意getView()方法中对数据的处理。
convertView可以认为是元素的缓存,因为元素本身没有变化,因此可以判断如果非空,就可以复用。减少重复new新对象,系统不断回收所带来的内存消耗!
具体可以参考这儿的文章:http://marshal.easymorse.com/archives/3944

接下要新建一个list.xml文件,这个就是布局image、textview、checkbox。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <ImageView
    	android:id="@+id/img"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:layout_gravity="center_vertical"/>
    <TextView 
    	android:id="@+id/title"
		android:textSize="18dip"
		android:layout_weight="1"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"/>
	<CheckBox
		android:id="@+id/cb"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:focusable="false"
        android:focusableInTouchMode="false"
        android:clickable="false"		
		android:checkMark="?android:attr/listChoiceIndicatorMultiple"/>
</LinearLayout>

android:layout_weight="1"这一句可以使中间的textview权重增大,从而后面的checkbok可以居右显示。
android:focusable="false"
        android:focusableInTouchMode="false"
        android:clickable="false"
这三句很重要,如果不加就会出现错误。
由于checkbox的点击事件优先级比listview的高,所以要在checkbox中添加android:focusable="false",使得checkbox初始的时候没有获取焦点。
接下来在main.xml中添加Listview组件
<ListView
		android:id="@+id/lv"
    	android:layout_width="fill_parent" 
    	android:layout_height="wrap_content"/>

接下来就是在activity中调用:
list=(ListView)findViewById(R.id.lv);
		MyAdapter adapter=new MyAdapter(this);
		list.setAdapter(adapter);
		list.setItemsCanFocus(false);
		list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

		list.setOnItemClickListener(new OnItemClickListener(){
			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				ViewHolder vHollder = (ViewHolder) view.getTag();
//在每次获取点击的item时将对于的checkbox状态改变,同时修改map的值。
				vHollder.cBox.toggle();
				MyAdapter.isSelected.put(position, vHollder.cBox.isChecked());
			}
		});

最新看一下效果图:



要获取哪些项目被选择了,可以这样测试:
OnClickListener bPop = new OnClickListener() {
		@Override
		public void onClick(View v) {
			for(int i=0;i<list.getCount();i++){
				if(MyAdapter.isSelected.get(i)){
					ViewHolder vHollder = (ViewHolder) list.getChildAt(i).getTag();
Log.i(TAG, "--onClick --"+vHollder.title.getText());
				}
			}
		}
	};


总结:
1、ListView的android:cacheColorHint="#00000000"会消除listview拖动时的全选效果。
2、ListView的getView()方法只获取当前屏幕可以显示出的view,对隐藏的,就是拖动可以看见的不会绘制,只有需要显示的时候才绘制。
3、数据可以在activity中获取,在初始化adapter的时候当做参数传递过去,这样就可以是list变成动态的。
4、给checkbox添加OnClickListener才会优先响应list item里面的checkbox。checkbox的OnClickListener监听实现方法要写在getview方法里面,否则获取不到position。如果不需要对checkbox做优先响应,不需要给checkbox添加OnClickListener。
5、如果要多选或全选需要新建一个list:
public static Map<Integer, Boolean> isSelected;

在点击listview 的item或者checkbox时将isSelected的值做相应改变。
6、如果不指定listview的分割线则会有些粗有些细,我指定了之后可以均匀显示。给listview添加下面属性:
        android:divider="#8B8B00"
        android:dividerHeight="1px"
  • 大小: 51.7 KB
9
1
分享到:
评论
1 楼 lm1991 2012-02-05  
我想问下为什么我运行了之后就错误退出了呢?。。。

相关推荐

    CheckBoxListView

    总的来说,CheckBoxListView是Android开发中一个实用的组件,它通过优化选择逻辑和处理图片错位问题,提升了用户在列表中的选择体验。理解和掌握这种实现方式对于提升Android应用的用户体验和开发技能非常有帮助。

    Android里ListView里面添加CheckBox实现多选

    本篇文章将深入探讨如何在ListView中实现CheckBox的多选功能,并使用ViewHolder和ConvertView优化性能。 1. **ListView与Adapter基础** - ListView是Android中用于显示长列表的视图,它可以动态加载和回收视图,以...

    android ListView+CheckBox实现单选

    本篇将详细讲解如何利用这两种组件实现ListView中的单选功能。 首先,我们需要理解ListView的工作原理。ListView通过Adapter将数据源(如ArrayList)绑定到视图上,每个数据项对应ListView的一个列表项。为了实现...

    android listview+checkbox实现多选

    在许多场景下,我们需要在ListView中加入复选框(Checkbox),实现多选功能,例如用户可以选择多个项目进行操作。本文将详细介绍如何在Android中使用ListView和Checkbox实现多选功能。 一、ListView概述 ListView是...

    Android ListView 带 CheckBox(全选,反选,全不选)

    2. **ListView中的CheckBox** - 在ListView的每个条目中插入一个CheckBox,可以通过自定义`ListView`的`Adapter`实现。通常,我们会创建一个继承自`BaseAdapter`的自定义类,并在`getView()`方法中设置CheckBox。 ...

    android listview 里面使用checkbox

    综上所述,要在Android的ListView中使用Checkbox,我们需要创建自定义Adapter,设计Checkbox的布局,管理复选状态,监听并处理用户操作,同时注意性能优化和状态恢复。在实际项目中,这样的实现方式能够提供灵活的...

    Android完美解决ListView复用导致的Checkbox状态混乱问题

    在Android开发中,ListView是常用的一种控件,用于展示大量数据列表。然而,ListView的复用机制有时会导致一些问题,特别是在涉及复选框(Checkbox)的状态管理时。本篇文章将详细探讨这个问题,并提供一个完美的...

    ListView中添加CheckBox

    1、ListView item中加入checkbox后onListItemClick 事件无法触发。 原因:checkbox的优先级高于ListItem于是屏蔽了ListItem的单击事件。 解决方案:设置checkbox的android:focusable="false" 2、选择其中的...

    listview中添加CheckBox的完美实现

    在我们的示例代码中,我们实现了一个完美的 ListView 中添加 CheckBox 的解决方案,它可以解决事件冲突和复用错误的问题。我们使用了一个自定义的 Adapter 来控制 ListView 中的每个项目,并使用了一个 HashMap 来...

    完美解决ListView和CheckBox的焦点冲突及CheckBox的复用问题

    然而,当ListView中的元素包含可交互的控件,如CheckBox时,会遇到一些常见问题,如焦点冲突和视图复用导致的显示异常。本文将详细探讨这些问题以及如何通过优化来实现“完美解决ListView和CheckBox的焦点冲突及...

    Android ListView CheckBox

    本篇文章将详细探讨如何在Android中实现一个具有多选、反选、删除和全选功能的ListView,结合CheckBox的使用。 首先,我们需要创建一个自定义的ListView项布局,包含一个TextView用于显示数据,以及一个CheckBox...

    Android ListView+checkbox 实现批量删除

    在实际应用中,我们经常需要实现一个功能,让用户能够选择ListView中的多个条目进行批量删除,这正是"Android ListView+checkbox 实现批量删除"这个主题所涵盖的知识点。下面我们将详细探讨如何在Android中实现这一...

    实现ListView中CheckBox的选中和选中项的记录

    通过以上步骤,我们可以实现ListView中CheckBox的选中状态管理和选中项记录。这不仅提高了用户体验,也为开发复杂的业务逻辑提供了基础。在实际项目中,可能还需要考虑多线程同步、异常处理等细节,以保证程序的稳定...

    android listview ScrollView冲突 listview checkbox

    在Android开发中,ListView与...总之,处理ListView与ScrollView的冲突以及ListView中CheckBox的使用,需要深入理解Android的列表视图机制和适配器模式。合理的设计和编程实践能够帮助我们构建高效且用户友好的界面。

    Android中使用ListView和CheckBox实现购物车多选功能

    综上所述,实现"Android中使用ListView和CheckBox实现购物车多选功能"涉及到ListView的自定义Adapter、CheckBox的状态管理、全选/全不选功能、多选操作的实现以及性能优化等多个环节。这个过程中需要充分理解Android...

    ListVIew 实现Checkbox多选

    本文将深入探讨如何在ListView中实现Checkbox多选功能,以及相关的Android编程技巧。 首先,我们需要创建一个自定义的ListView adapter。这个adapter将负责渲染每一项数据,并在每一项中包含一个Checkbox。在Java...

    Android中ListView结合CheckBox获取选中项.rar

    本示例"Android中ListView结合CheckBox获取选中项.rar"旨在教授如何在ListView中集成CheckBox,并有效地获取用户选择的数据。 1. **ListView基本使用** - ListView是一个可以滚动的视图,它能显示一行行的数据。...

    android listview和checkbox联合使用选中和取消

    本文将详细介绍如何在Android应用中实现ListView与CheckBox的联合使用,包括数据绑定、事件监听以及选中状态管理。 首先,我们需要创建一个自定义的ListView项布局,该布局中包含一个CheckBox。例如,创建一个名为...

    Android 长按Listview显示CheckBox,实现批量删除

    Android 长按Listview显示CheckBox,实现批量删除,具体功能请参考: http://blog.csdn.net/ddxxll2008/article/details/49125759

Global site tag (gtag.js) - Google Analytics