`
heji
  • 浏览: 88802 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

关于android“多选”的小研究

阅读更多
     转载请注明出处:http://heji.iteye.com/blog/731310
     
      android里面自带有多选的布局,文件名是:simple_list_item_multiple_choice.xml,它的源码如下:
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
  
          http://www.apache.org/licenses/LICENSE-2.0
  
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:gravity="center_vertical"
    android:checkMark="?android:attr/listChoiceIndicatorMultiple"
    android:paddingLeft="6dip"
    android:paddingRight="6dip"
/>

是一个CheckedTextView的组件。只能实现一个TextView和一个CheckBox的组件。在开发中肯定是不能满足我们的需求的。貌似与它绑定的好像只有ArrayAdapter。什么SimpleAdapter,SimpleCursorAdapter这些Adapter不能与之绑定,看看构造函数就知道了。怎么才能更佳美化我们的ListView的UI呢?只有一个办法,重写一个Adapter,来适配我们的自己的ListView。
下面这个是需要现实在ListView中的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/row"
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="horizontal"
	android:layout_width="fill_parent"
	android:layout_height="wrap_content"
	>
	
	<RelativeLayout 
		android:layout_width="fill_parent"
		android:layout_height="wrap_content">
	
		<ImageView android:id="@+id/tag"
		    android:layout_width="wrap_content" 
			android:layout_height="wrap_content"
			android:background="@drawable/icon"/>
		
		<LinearLayout android:layout_width="wrap_content" 
			android:layout_height="wrap_content"
			android:layout_marginLeft="5dip"
			android:orientation="vertical"
			android:layout_marginTop="7dip"
			android:layout_toRightOf="@id/tag"
			>
		
			<TextView android:id="@+id/multiple_title"
				android:layout_width="fill_parent" 
				android:layout_height="wrap_content"
			    android:gravity="center_vertical"
				android:textSize="20dip"
				android:layout_marginLeft="5dip"/>
				
				
			<TextView android:id="@+id/multiple_summary" 
			    android:layout_width="fill_parent"
				android:layout_height="wrap_content" 
				android:layout_marginLeft="5dip"
				android:gravity="center_vertical"/>
		
		</LinearLayout>
		
		<!-- 
		这三个很重要
		android:focusable="false"
		android:focusableInTouchMode="false"
		android:clickable="false"
		 -->
		<CheckBox  
		        android:id="@+id/multiple_checkbox"
		        android:layout_width="wrap_content" 
				android:layout_height="wrap_content"
				android:layout_gravity="center_vertical"
				android:layout_marginTop="6dip"
				android:focusable="false"
				android:focusableInTouchMode="false"
				android:clickable="false"
				android:layout_alignParentRight="true"/>
	
	</RelativeLayout>
	    
</LinearLayout>

这个文件是Activity的布局文件:
<?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="wrap_content"
	>
	
	<ListView android:id="@+id/listview"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:cacheColorHint="#00000000"
		 />
		
</LinearLayout>

有了上面的两个文件,就可以写Activity了~~~~
下面的是源码:
package com.heji.demo.effect;

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

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;

import com.heji.demo.R;

public class MultipleChoiceActivity extends Activity implements OnItemClickListener{
	
	private MyAdapter mSimpleAdapter;
	
	public final static String NAME = "name";  
	public final static String PHONE_NUMBER = "phone"; 

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		setTitle("带有多选的Listview");
		
		setContentView(R.layout.multiple_checkbox_main);
		
		ListView listView = (ListView) findViewById(R.id.listview);
		
		ArrayList<Map<String, String>> al = new ArrayList<Map<String,String>>();
		Map<String, String> map1 = new HashMap<String, String>();
		
		map1.put(NAME, "A");
		map1.put(PHONE_NUMBER, "132456789");
		al.add(map1);
		
		Map<String, String> map2 = new HashMap<String, String>();
		map2.put(NAME, "B");
		map2.put(PHONE_NUMBER, "132134");
		al.add(map2);
		
		Map<String, String> map3 = new HashMap<String, String>();
		map3.put(NAME, "C");
		map3.put(PHONE_NUMBER, "132134");
		al.add(map3);
		
		Map<String, String> map4 = new HashMap<String, String>();
		map4.put(NAME, "D");
		map4.put(PHONE_NUMBER, "132134");
		al.add(map4);
		
		Map<String, String> map5 = new HashMap<String, String>();
		map5.put(NAME, "E");
		map5.put(PHONE_NUMBER, "132134");
		al.add(map5);
		
		Map<String, String> map6 = new HashMap<String, String>();
		map6.put(NAME, "F");
		map6.put(PHONE_NUMBER, "132134");
		al.add(map6);
		
		Map<String, String> map7 = new HashMap<String, String>();
		map7.put(NAME, "G");
		map7.put(PHONE_NUMBER, "132134");
		al.add(map7);
		
		
		Map<String, String> map8 = new HashMap<String, String>();
		map8.put(NAME, "H");
		map8.put(PHONE_NUMBER, "132134");
		al.add(map8);
		
		Map<String, String> map9 = new HashMap<String, String>();
		map9.put(NAME, "I");
		map9.put(PHONE_NUMBER, "132134");
		al.add(map9);
		
		Map<String, String> map10 = new HashMap<String, String>();
		map10.put(NAME, "J");
		map10.put(PHONE_NUMBER, "132134");
		al.add(map10);
		
		Map<String, String> map11 = new HashMap<String, String>();
		map11.put(NAME, "K");
		map11.put(PHONE_NUMBER, "132134");
		al.add(map11);
		
		
		String[] from = { NAME, PHONE_NUMBER };
		int[] to = { R.id.multiple_title, R.id.multiple_summary };
		mSimpleAdapter = new MyAdapter(this, al, R.layout.multiple_checkbox_main_row, from, to);
		
		listView.setAdapter(mSimpleAdapter);
		listView.setOnItemClickListener(this);
	}

	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
		CheckBox checkBox = (CheckBox) view.findViewById(R.id.multiple_checkbox);
		
		checkBox.toggle();
		
		mSimpleAdapter.map.put(position, checkBox.isChecked());
		
	}
	
	public class MyAdapter extends SimpleAdapter {
		
		Map<Integer, Boolean> map; 
		
		LayoutInflater mInflater;
		
		private List<? extends Map<String, ?>> mList;
		
		public MyAdapter(Context context, List<Map<String, String>> data,
				int resource, String[] from, int[] to) {
			super(context, data, resource, from, to);
			map = new HashMap<Integer, Boolean>();
			mInflater = LayoutInflater.from(context);
			mList = data;
			for(int i = 0; i < data.size(); i++) {
				map.put(i, false);
			} 
		}
		
		@Override
		public int getCount() {
			return mList.size();
		}

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

		@Override
		public long getItemId(int position) {
			return position;
		}
		
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			if(convertView == null) {
				convertView = mInflater.inflate(R.layout.multiple_checkbox_main_row, null);
			}
			TextView tN = (TextView) convertView.findViewById(R.id.multiple_title);
			tN.setText((String)mList.get(position).get(NAME));
			
			TextView tP = (TextView) convertView.findViewById(R.id.multiple_summary);
			tP.setText((String)mList.get(position).get(PHONE_NUMBER));
			
			CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.multiple_checkbox);
			
			checkBox.setChecked(map.get(position)); 
			
			return convertView;
		}
		
	}

}


  下面我来分析为什么要用map来保存checkbox的状态。
这个与ListView的刷新机制有关,当你的listview对象很多的时候,每次你拖动listview上下滚动,listview都会刷新一次。怎么刷新呢?比如一个屏幕它最多只显示七条listview,如果你有十条数据,当你想看第八条时,第一条数据理所当然的要被隐藏掉,而第八条数据会被显示,这时listview就刷新了。如果你不保存你所选的checkbox的状态,这时如果你选的是第一条的checkbox的状态为true,当你把余下的第八、第九、第十条数据显示出来时,第十条的checkbox的状态会显示为true,但是它的状态没有被保存,只是你看到它是被选中了而已,其实你选的还是第一条数据。这个问题很操蛋。还有一个更离奇的状态,你让checkbox的状态为true,数据一定要大于十条,你不停的上下拖动屏幕,你会看见checkbox的显示状态会乱跳,但是你实际上选择的还是第一条数据,只是会让你的用户感觉很不爽罢了。难道这个就是android的一个小bug?嘿嘿~~~~
   好了,源码我已经贴出来了,希望各路大牛讨论。代码有不对的地方也希望指正,谢谢
~~~~

分享到:
评论
4 楼 guoyu04 2011-02-28  
大哥,你真棒
3 楼 heji 2010-11-05  
很简单啊,你用一个容器存放你所选中的项,为true就放进你的容器里面,为false就不放进去呗,然后再对你的这个容器做相应的操作
2 楼 heji 2010-10-19  
bbzhucheng 写道
这个问题真的很操蛋 我也困扰呢

已经解决了嘛~~~呵呵
1 楼 bbzhucheng 2010-10-12  
这个问题真的很操蛋 我也困扰呢

相关推荐

    android自定义多选对话框

    "android自定义多选对话框"是一个常见的需求,特别是在需要用户从多个选项中进行选择时。在这个主题中,我们将深入探讨如何创建这样一个自定义的多选对话框。 首先,Android的`AlertDialog`类是系统提供的标准...

    android 多选库源码.rar

    在Android开发中,多选库通常用于实现用户在列表或者网格视图中进行多项选择的功能,比如在邮件应用中选择多个邮件,或者在照片应用中批量删除或分享图片。"android 多选库源码.rar" 提供了一个专门用于实现这一功能...

    Android 多选库-IT计算机-毕业设计.zip

    通过深入研究这个毕业设计项目,不仅可以掌握Android多选库的实现,还能提高Android开发的整体技能,为未来的项目开发打下坚实基础。同时,这也是一个很好的实践机会,将理论知识转化为实际操作,锻炼解决问题的能力...

    Android 树形结构的多选CheckBox

    通过下载并研究`TreeDemo-master`这个项目源码,我们可以更深入地了解这些实现细节,学习如何在自己的应用中实现类似的树形结构多选功能。同时,这也能帮助我们提升在Android UI设计和数据结构处理方面的技能。

    Android高级应用源码-自定义本地相册的功能,可以多选图片用.zip

    在Android开发中,自定义本地相册功能是一个常见的需求,特别是在涉及到用户选择多张图片的应用场景,...通过深入研究和实践,开发者可以了解到Android多媒体处理、自定义视图、数据绑定、权限管理等多个方面的知识。

    Android-android相册支持单选模式和多选模式

    `wqgallery`是一个专门为Android平台设计的图片选择库,它提供了丰富的功能,包括从相机或相册选取图片、单张图片裁剪以及支持单选和多选模式。下面我们将深入解析其主要特性和实现方式。 1. **图片选择方式**: -...

    Android问卷或试题Demo,支持单项、多选、判断.rar

    本项目“Android问卷或试题Demo,支持单项、多选、判断”提供了一个简单的实现,帮助开发者快速理解如何在Android平台上构建此类功能。下面我们将深入探讨这个Demo中的关键知识点。 1. **Android UI设计**: - ...

    Android-一款通用的筛选组件支持单选复选多级筛选筛选联动筛选数据懒加载

    多级筛选允许用户在多个层次上进行过滤,例如在商品分类中,用户可以先选择大类别(如电子产品),再细化到小类别(如手机品牌)。这种设计使筛选过程更具有深度,能更精确地定位用户所需信息。 3. **筛选联动**:...

    Android 实现列表多选的DEMO-IT计算机-毕业设计.zip

    通过这个DEMO,学习者可以了解Android多选列表的实现原理,包括数据绑定、用户交互、状态管理等多个方面,对于提升Android开发技能和理解毕业设计要求非常有帮助。在实际项目中,可以根据这个DEMO进行扩展,比如添加...

    Android 图片多选.rar

    在Android开发中,图片多选是一个常见的功能,广泛应用于各种社交、相册应用中。这个“Android 图片多选.rar”文件很可能包含了一个简单的图片选择器的源代码实现,可以帮助开发者快速集成到自己的项目中。下面我们...

    安卓图片多选相关-类似微信Android版的图片多选库。.zip

    【标题】"安卓图片多选相关-类似微信Android版的图片多选库。.zip" 涉及的核心知识点是Android平台上的图片选择功能,尤其是针对用户需要批量选择多张图片的应用场景。这类功能在很多应用程序中都有所应用,比如微信...

    实现列表多选的DEMO

    在Android开发中,实现列表多选是一个常见的需求,特别是在创建如设置界面或文件管理器等交互丰富的应用时。...通过研究这个DEMO,开发者可以学习到如何在Android应用中实现功能完善的多选列表,提升用户体验。

    android GridView多选单选

    1. 多选:在Android中,我们可以使用CheckBox或其他开关组件来实现多选。在适配器的`getView()`方法中,为每个GridView项添加一个CheckBox,并关联一个 SparseBooleanArray 来存储选中状态。当CheckBox被选中或取消...

    Android-一款图片选择器支持单选多选裁剪适配7.0适配小米

    对于Android开发者来说,它不仅可以直接用于项目中,也可以作为学习和研究Android图像处理、适配策略的一个实例。通过深入理解并实践其中的代码,开发者可以提升自己的技能,为用户提供更加稳定和流畅的图片选择体验...

    CheckBox实现多选、全选、反选功能

    请仔细研究项目中的布局文件、Activity代码和自定义Adapter,它们共同完成了多选、全选和反选的功能。通过这个例子,你可以了解到Android开发中如何处理用户交互和数据管理,为自己的应用增加类似的功能。

    安卓Android源码——多选库.zip

    开发者可以研究源码,了解如何在不同的组件(如ListView或RecyclerView)上实现多选,如何处理用户的点击事件,以及如何保存和恢复用户的多选状态。此外,通过学习ActionBarSherlock,开发者还能学习到如何实现向后...

    各种控件(单选多选,加载,底部弹出,)

    它们通常用于呈现二选一或多选一的场景,如性别选择(男/女)或颜色选择(红色/蓝色)。复选框(Checkbox)则允许用户选择多个选项,没有限制,适用于多选场景,如订阅服务时勾选不同的兴趣领域。 加载指示器...

    Android项目源码支持计时单选多选答错提示错题统计的答题系统.rar.rar

    这个Android项目源码是专为开发一款具有计时、单选、多选功能的答题系统设计的,同时它还具备答错提示...通过研究这个项目,开发者不仅可以学习到如何构建一个完整的答题应用,还能提升在Android开发中的实际操作能力。

    开源项目——MultiChoiceAdapter(可多选的适配器)

    MultiChoiceAdapter作为一款开源的可多选适配器,为Android开发者提供了便利,使得实现多选功能变得更加简单。通过理解其核心特性、实现原理以及应用场景,开发者可以更好地利用这款工具提升应用的交互体验。同时,...

    Android多级树形选择列表

    在Android开发中,多级树形选择列表是一种常见的UI组件,尤其在...开源项目是很好的学习资源,通过研究他人的代码,可以快速提升自己的开发技能。在实际应用中,根据需求调整和优化,打造符合产品特性的树形选择列表。

Global site tag (gtag.js) - Google Analytics