本文可以帮助 完美解决 在Android中使用ListView时批量操作CheckBox出现的各种问题。
在Android中使用ListActivity可以很方便的绑定一组数据或者一个查询。但是,使用过程中也会遇到一些问题。在此,我将自己遇到的问题以及解决方法记录下来,一方面做一个备忘,同时,也希望有缘人能少走弯路。
问题一: Listview中的Item数目到底是多少
ListView中的Item数目可以使用getCount方法获得,经过验证得到的结果是,其Item数目等于界面上显示的Item数目,这个数目可能小于实际上绑定的数据条目数。
那么,在实际中如果有额外的非绑定数据源的数据需要编辑保存的时候,如何才能保存他们呢?
解决该问题的方法是:自定义ListAdapter,在其中保存额外需要保存的数据。
问题二:在Item中添加CheckBox出现麻烦了
在item中添加Checkbox的时候不小心会遇到麻烦,可能出现的情况是:
(1)Listview不能相应点击事件
(2)Listview点击第一个Item的时候最后一个Item也出现点击事件(反之亦然)
以上两种情况是我实际遇到的bug,经过各种纠结和反复测试,出现问题的原因是CheckBox相应焦点、点击事件的优先级别比Listview要高,所以出现问题。
解决方法如下(和问题一一对应):
(1)将Checkbox设置focusable属性为false
(2)接着将CheckBox设置Clickable属性为false.
以下是本人程序片段,仅供参考:
-
-
<?xmlversion="1.0"encoding="utf-8"?>
-
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
-
android:layout_width="fill_parent"
-
android:layout_height="fill_parent"
-
android:paddingLeft="8dp"
-
android:paddingRight="8dp">
-
- <TextView
-
android:id="@+id/ans_title"
-
android:layout_width="fill_parent"
-
android:layout_height="wrap_content"
-
android:layout_alignParentTop="true"
-
android:gravity="center"
-
android:textSize="15sp"
-
android:textStyle="bold"/>
-
- <RelativeLayout
-
android:id="@+id/ans_foot"
-
android:layout_width="fill_parent"
-
android:layout_height="wrap_content"
-
android:layout_alignParentBottom="true"
-
android:paddingLeft="8sp"
-
android:paddingRight="8sp">
-
- <CheckBox
-
android:id="@+id/ans_cbx_select"
-
android:layout_width="wrap_content"
-
android:layout_height="wrap_content"
-
android:layout_alignParentRight="true"
-
android:layout_marginLeft="10sp"
-
android:checked="false"/>
- <Button
-
android:id="@+id/ans_btn_showInMap"
-
android:layout_width="fill_parent"
-
android:layout_height="wrap_content"
-
android:layout_toLeftOf="@id/ans_cbx_select"
-
android:text="@string/ans_btn_showInMap"/>
- </RelativeLayout>
-
- <ListView
-
android:id="@android:id/list"
-
android:layout_width="fill_parent"
-
android:layout_height="fill_parent"
-
android:layout_above="@id/ans_foot"
-
android:layout_below="@id/ans_title"
-
android:drawSelectorOnTop="false">
- </ListView>
-
- <TextView
-
android:id="@android:id/empty"
-
android:layout_width="fill_parent"
-
android:layout_height="fill_parent"
-
android:gravity="center"
-
android:text="@string/ans_list_empty"
-
android:textSize="25sp"
-
android:textStyle="bold">
- </TextView>
-
-
</RelativeLayout>
-
-
-
<?xmlversion="1.0"encoding="utf-8"?>
-
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
-
android:layout_width="fill_parent"
-
android:layout_height="wrap_content"
-
android:padding="10sp">
-
- <CheckBox
-
android:id="@+id/ans_item_select"
-
android:layout_width="wrap_content"
-
android:layout_height="wrap_content"
-
android:layout_alignParentRight="true"
-
-
android:focusable="false"
-
android:clickable="false"
-
-
android:checked="false"
-
android:gravity="center_vertical"/>
-
- <RelativeLayout
-
android:layout_width="fill_parent"
-
android:layout_height="wrap_content"
-
android:layout_alignParentLeft="true"
- >
-
- ....
-
- <TextView
-
android:id="@+id/ans_item_time"
-
android:layout_width="wrap_content"
-
android:layout_height="wrap_content"
-
android:layout_below="@id/ans_item_locname"
-
android:layout_toRightOf="@id/a4"/>
- </RelativeLayout>
-
-
</RelativeLayout>
-
publicclassAnsListextendsListActivity{
-
-
privatePoiDbAdapterdba=null;
-
privateCursorcursor=null;
-
privateListViewlistView=null;
-
- @Override
-
protectedvoidonCreate(BundlesavedInstanceState){
-
super.onCreate(savedInstanceState);
- setContentView(R.layout.ans_list);
- ...
-
- initList();
-
if(listView==null||listView.getCount()<1){
- findViewById(R.id.ans_foot).setVisibility(View.GONE);
- }else{
- initEvents();
- }
- }
-
-
privatevoidinitList(){
- listView=getListView();
- dba=newPoiDbAdapter(this);
- cursor=dba.selectAnsByQnaire(QNaireBuilder.getQnaire(null)
- .getQnaireId());
- startManagingCursor(cursor);
- MyCursorAdapteradapter=newMyCursorAdapter(this,R.layout.ans_item,
- cursor,newString[]{ARemoteId,ALongi,ALati,ALocName,
- ATime},newint[]{R.id.ans_item_num,
- R.id.ans_item_longi,R.id.ans_item_lati,
- R.id.ans_item_locname,R.id.ans_item_time});
- adapter.setViewBinder(newSimpleCursorAdapter.ViewBinder(){
-
publicbooleansetViewValue(Viewview,Cursorcursor,
-
intcolumnIndex){
- Stringtext=cursor.getString(columnIndex);
-
if(cursor.getColumnName(columnIndex).equalsIgnoreCase(ATime)){
- text=TimeTools.formatTime(Long.valueOf(text));
- }
-
if(viewinstanceofTextView){
- ((TextView)view).setText(text);
- }
-
returntrue;
- }
- });
- setListAdapter(adapter);
- }
-
-
privatevoidinitEvents(){
-
- ....
-
- ((CheckBox)findViewById(R.id.ans_cbx_select))
- .setOnCheckedChangeListener(newCompoundButton.OnCheckedChangeListener(){
- @Override
-
publicvoidonCheckedChanged(CompoundButtonbuttonView,
-
booleanisChecked){
- selectAllOrNot(isChecked);
- }
- });
-
- }
-
- ...
-
-
protectedvoidselectAllOrNot(booleanisChecked){
-
intcount=listView.getChildCount();
-
for(inti=0;i<count;i++){
- ((CheckBox)((listView.getChildAt(i))
- .findViewById(R.id.ans_item_select))).setChecked(isChecked);
- }
- ((MyCursorAdapter)listView.getAdapter()).selectAll(isChecked);
- }
-
- ...
-
-
- @Override
-
protectedvoidonListItemClick(ListViewl,Viewv,intposition,longid){
-
- CheckBoxcbx=(CheckBox)v.findViewById(R.id.ans_item_select);
-
if(cbx!=null){
- cbx.toggle();
- ((MyCursorAdapter)l.getAdapter())
- .select(position,cbx.isChecked());
- }
- }
-
- }
-
-
-
publicclassMyCursorAdapterextendsSimpleCursorAdapter{
-
-
privateHashMap<Integer,Boolean>isSelected=null;
-
-
publicMyCursorAdapter(Contextcontext,intlayout,Cursorc,
- String[]from,int[]to){
-
super(context,layout,c,from,to);
- isSelected=newHashMap<Integer,Boolean>();
- selectAll(false);
- }
-
-
- @Override
-
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
- convertView=super.getView(position,convertView,parent);
- Booleanb=isSelected.get(position);
-
if(null==b)
- b=false;
-
if(convertViewinstanceofViewGroup){
- ViewGroupg=(ViewGroup)convertView;
-
for(inti=0;i<g.getChildCount();i++){
- Viewv=g.getChildAt(i);
-
if(vinstanceofCheckBox){
- ((CheckBox)v).setChecked(b);
-
break;
- }
- }
- }
-
returnconvertView;
- }
-
-
publicvoidselect(intpostion,booleanisChecked){
- isSelected.put(postion,isChecked);
- }
-
-
publicvoidselectAll(booleanisChecked){
-
inta=this.getCount();
-
for(intb=0;b<a;b++){
- select(b,isChecked);
- }
- }
- }
经过折腾之后,终于顺利通过调试,可以轻松实现全选批量操作,
分享到:
相关推荐
知识点:1、解决listView滚动时checkBox的选择状态会发生变化(絮乱);2、ListView的Item长按,点击时间并存,实现同一UI控件多需求响应各类事件;3、点击ListViewItem选中响应Item里的CheckBox;4、计算选中的项数...
Android 长按Listview显示CheckBox,实现批量删除,具体功能请参考: http://blog.csdn.net/ddxxll2008/article/details/49125759
Android完美解决ListView复用导致的Checkbox状态混乱问题,具体见博客 http://www.jianshu.com/p/744dcca03a99
完美解决了ListView和CheckBox的焦点冲突及CheckBox的复用问题,讲解了CheckBox的全选、反选、删除功能及在下拉刷新和下拉加载中如何保存CheckBox的先前的选中状态
解决方案:设置checkbox的android:focusable="false" 2、选择其中的checkbox,当滚动ListView的时候,会出现一些Checkbox选择错位的现象, 原因:为记住Checkbox的选择状态 解决方案:当选择Checkbox的时候,记下...
本文主要实现在自定义的ListView布局中加入CheckBox控件,通过判断用户是否选中CheckBox来对ListView的选中项进行相应的操作。通过一个Demo来展示该功能,选中ListView中的某一项,然后点击Button按钮来显示选中了...
android listview和checkbox联合使用,选中和取消
使用ListView跟CheckBox实现listView内容的单选,思路大概是使用一个list用来记录选择位置,每次选择新位置之后重新设置list值,刷新下listview
Android中ListView结合CheckBox结合,随意实现获取选中值,可以实现实战中类似的大部分需求
这是我自己写的android listview里面使用checkbox的demo
WPF中ListView添加CheckBox列
用Android写的一个小测试,用checkbox实现批量删除。
实现ListView上CheckBox的选择动态改变选中项的数目以及提取选中项信息,可以运用到购物车结算模块中
Android ListView实现长按Item弹出CheckBox和操作界面进行批量删除功能,模仿某播放器
在delphi中使用listview控件,启用checkbox选项后,默认是多选,此示例实现单选功能,在Delphi7下测试通过。
解决ListView嵌套CheckBox滑动时CheckBox选中状态错乱问题,以及listview中事件点击冲突问题;一个简单的小Demo;
Android里ListView里面添加CheckBox实现多选,用上ViewHolder和ConvertView
今天给别人写了一个多选框的应用,功能是淘宝购物车里面选择商品,全选和分开选,和大家交流学习
ListView和CheckBox结合完成的批量删除操作。
android ListView中的checkBox全选和反选Demo