- 浏览: 88977 次
- 性别:
- 来自: 重庆
最新评论
-
LuAndroid:
能把源码开发吗?很想研究一下!谢谢
发一个自己做的备份软件 -
macrotea:
高手在民间
发一个自己做的备份软件 -
heji:
myy707 写道把代码上传一下吧,怎么是apk包呀 不好意思 ...
发一个自己做的备份软件 -
myy707:
把代码上传一下吧,怎么是apk包呀
发一个自己做的备份软件 -
heji:
qb311 写道老何也开博老所,踩一个早开了,不过很少写东西
三星I9000在ubuntu下用adb调试
转载请注明出处:http://heji.iteye.com/blog/731310
android里面自带有多选的布局,文件名是:simple_list_item_multiple_choice.xml,它的源码如下:
是一个CheckedTextView的组件。只能实现一个TextView和一个CheckBox的组件。在开发中肯定是不能满足我们的需求的。貌似与它绑定的好像只有ArrayAdapter。什么SimpleAdapter,SimpleCursorAdapter这些Adapter不能与之绑定,看看构造函数就知道了。怎么才能更佳美化我们的ListView的UI呢?只有一个办法,重写一个Adapter,来适配我们的自己的ListView。
下面这个是需要现实在ListView中的布局文件:
这个文件是Activity的布局文件:
有了上面的两个文件,就可以写Activity了~~~~
下面的是源码:
下面我来分析为什么要用map来保存checkbox的状态。
这个与ListView的刷新机制有关,当你的listview对象很多的时候,每次你拖动listview上下滚动,listview都会刷新一次。怎么刷新呢?比如一个屏幕它最多只显示七条listview,如果你有十条数据,当你想看第八条时,第一条数据理所当然的要被隐藏掉,而第八条数据会被显示,这时listview就刷新了。如果你不保存你所选的checkbox的状态,这时如果你选的是第一条的checkbox的状态为true,当你把余下的第八、第九、第十条数据显示出来时,第十条的checkbox的状态会显示为true,但是它的状态没有被保存,只是你看到它是被选中了而已,其实你选的还是第一条数据。这个问题很操蛋。还有一个更离奇的状态,你让checkbox的状态为true,数据一定要大于十条,你不停的上下拖动屏幕,你会看见checkbox的显示状态会乱跳,但是你实际上选择的还是第一条数据,只是会让你的用户感觉很不爽罢了。难道这个就是android的一个小bug?嘿嘿~~~~
好了,源码我已经贴出来了,希望各路大牛讨论。代码有不对的地方也希望指正,谢谢~~~~
已经解决了嘛~~~呵呵
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
这个问题真的很操蛋 我也困扰呢
发表评论
-
发一个自己做的备份软件
2011-09-20 13:52 1640前段时间自己做的一个备份软件。 本软件可以备份联系人,短信,通 ... -
三星I9000在ubuntu下用adb调试
2011-04-18 09:11 2580(1) 在终端运行lsusb 会发现结果有会有如下类似记录: ... -
获取上网IP
2010-11-18 14:25 1567这两天在做一个根据IP地址来定位城市的功能。两个方案: ... -
一些小技巧(持续更新……)
2010-11-02 14:58 1534监听网络状态的改变 : 权限 : <uses-p ... -
一些小效果(持续更新……)
2010-10-26 11:21 2003EditText无边框 style=" ... -
android一些有用的方法总结(持续更新……)
2010-09-07 15:17 4980这些方法在开发中用的上,在这里记录一下,以后查阅。 ... -
小议canvas的save()和restore()
2010-07-21 15:24 1600在Canvas的类中有两个方法大家估计也经常用到在画一些图形的 ... -
解决编译android2.2源码时出错的问题
2010-07-08 16:52 3126今天编译android2.2的源码出现问题,问题如下: I ... -
android中的格式化字符串
2010-06-29 10:22 4287在strings.xml文件中定义: <string ... -
SeekBar自定义
2010-05-18 19:40 5781要实现下面图的效果 代码如下 <SeekBar ... -
解决编译android源码后没有中文输入法
2010-05-17 16:14 1917编译mmm packages/inputmethods/Pin ... -
编译android2.1Music源码的问题
2010-04-02 15:51 1193今天郁闷了一个上午,编译android2.1Music ... -
ubuntu9.10下的android源码下载及编译
2010-02-07 17:07 5222好久都没有更新博客了,把ubuntu9.10下的编译源码的步骤 ... -
android火车时刻
2010-01-07 14:39 1890版权所有,欢迎转载。转载请注明:http://heji.ite ... -
Eclipse下Android-SDK-1.5模拟器启动设置
2009-04-16 17:24 84242009.4.14,Google再次放出Android ... -
一个Android登陆的简单实现
2009-03-11 11:16 12165在公司实习半个月了,上个星期开始接触Android, ...
相关推荐
"android自定义多选对话框"是一个常见的需求,特别是在需要用户从多个选项中进行选择时。在这个主题中,我们将深入探讨如何创建这样一个自定义的多选对话框。 首先,Android的`AlertDialog`类是系统提供的标准...
在Android开发中,多选库通常用于实现用户在列表或者网格视图中进行多项选择的功能,比如在邮件应用中选择多个邮件,或者在照片应用中批量删除或分享图片。"android 多选库源码.rar" 提供了一个专门用于实现这一功能...
通过深入研究这个毕业设计项目,不仅可以掌握Android多选库的实现,还能提高Android开发的整体技能,为未来的项目开发打下坚实基础。同时,这也是一个很好的实践机会,将理论知识转化为实际操作,锻炼解决问题的能力...
通过下载并研究`TreeDemo-master`这个项目源码,我们可以更深入地了解这些实现细节,学习如何在自己的应用中实现类似的树形结构多选功能。同时,这也能帮助我们提升在Android UI设计和数据结构处理方面的技能。
在Android开发中,自定义本地相册功能是一个常见的需求,特别是在涉及到用户选择多张图片的应用场景,...通过深入研究和实践,开发者可以了解到Android多媒体处理、自定义视图、数据绑定、权限管理等多个方面的知识。
`wqgallery`是一个专门为Android平台设计的图片选择库,它提供了丰富的功能,包括从相机或相册选取图片、单张图片裁剪以及支持单选和多选模式。下面我们将深入解析其主要特性和实现方式。 1. **图片选择方式**: -...
本项目“Android问卷或试题Demo,支持单项、多选、判断”提供了一个简单的实现,帮助开发者快速理解如何在Android平台上构建此类功能。下面我们将深入探讨这个Demo中的关键知识点。 1. **Android UI设计**: - ...
多级筛选允许用户在多个层次上进行过滤,例如在商品分类中,用户可以先选择大类别(如电子产品),再细化到小类别(如手机品牌)。这种设计使筛选过程更具有深度,能更精确地定位用户所需信息。 3. **筛选联动**:...
通过这个DEMO,学习者可以了解Android多选列表的实现原理,包括数据绑定、用户交互、状态管理等多个方面,对于提升Android开发技能和理解毕业设计要求非常有帮助。在实际项目中,可以根据这个DEMO进行扩展,比如添加...
在Android开发中,图片多选是一个常见的功能,广泛应用于各种社交、相册应用中。这个“Android 图片多选.rar”文件很可能包含了一个简单的图片选择器的源代码实现,可以帮助开发者快速集成到自己的项目中。下面我们...
【标题】"安卓图片多选相关-类似微信Android版的图片多选库。.zip" 涉及的核心知识点是Android平台上的图片选择功能,尤其是针对用户需要批量选择多张图片的应用场景。这类功能在很多应用程序中都有所应用,比如微信...
在Android开发中,实现列表多选是一个常见的需求,特别是在创建如设置界面或文件管理器等交互丰富的应用时。...通过研究这个DEMO,开发者可以学习到如何在Android应用中实现功能完善的多选列表,提升用户体验。
1. 多选:在Android中,我们可以使用CheckBox或其他开关组件来实现多选。在适配器的`getView()`方法中,为每个GridView项添加一个CheckBox,并关联一个 SparseBooleanArray 来存储选中状态。当CheckBox被选中或取消...
对于Android开发者来说,它不仅可以直接用于项目中,也可以作为学习和研究Android图像处理、适配策略的一个实例。通过深入理解并实践其中的代码,开发者可以提升自己的技能,为用户提供更加稳定和流畅的图片选择体验...
请仔细研究项目中的布局文件、Activity代码和自定义Adapter,它们共同完成了多选、全选和反选的功能。通过这个例子,你可以了解到Android开发中如何处理用户交互和数据管理,为自己的应用增加类似的功能。
开发者可以研究源码,了解如何在不同的组件(如ListView或RecyclerView)上实现多选,如何处理用户的点击事件,以及如何保存和恢复用户的多选状态。此外,通过学习ActionBarSherlock,开发者还能学习到如何实现向后...
它们通常用于呈现二选一或多选一的场景,如性别选择(男/女)或颜色选择(红色/蓝色)。复选框(Checkbox)则允许用户选择多个选项,没有限制,适用于多选场景,如订阅服务时勾选不同的兴趣领域。 加载指示器...
这个Android项目源码是专为开发一款具有计时、单选、多选功能的答题系统设计的,同时它还具备答错提示...通过研究这个项目,开发者不仅可以学习到如何构建一个完整的答题应用,还能提升在Android开发中的实际操作能力。
MultiChoiceAdapter作为一款开源的可多选适配器,为Android开发者提供了便利,使得实现多选功能变得更加简单。通过理解其核心特性、实现原理以及应用场景,开发者可以更好地利用这款工具提升应用的交互体验。同时,...
在Android开发中,多级树形选择列表是一种常见的UI组件,尤其在...开源项目是很好的学习资源,通过研究他人的代码,可以快速提升自己的开发技能。在实际应用中,根据需求调整和优化,打造符合产品特性的树形选择列表。