最近在做一个防火墙应用,需要从数据库中得到数据,显示在ListView中,同时每一个Item还有几个CheckBox,可以直接点击CheckBox来更新数据库的内容。效果图是这样的:
首先提一下,Android设计ListView主要是用来展示数据,在其中进行各种操作的效率不高,应该尽可能的避免在其中进行过多操作。
下面是在实现过程中遇到了一些问题和解决的思路。
最初的解决思路:使用自定义的CursorAdapter,将数据库中的数据展示在ListView中,然后在adapter中对CheckBox添加setOnCheckChangedListener,来监听点击并更新到数据库。
1.在成功添加CheckBox,并setOnCheckChangedListener来更新数据库之后,出现了一个问题:当点击一个CheckBox以后,查看数据库发现正常更新,但是向下滚动屏幕直到该Item被隐藏,然后再向上滚动重新显示该条目时,CheckBox又回到原来的状态。
经过分析,发现问题在于更新数据库之后,CursorAdapter所使用的cursor没有更新,仍旧是旧的数据,因此在重新bindView时CheckBox回到原来的状态。
简单的解决方案是给数据库设置一个ContentObserver,并在数据库改变时重新查询和更新界面。当然,如果api level在11以上时,可以直接使用 public CursorAdapter (Context context, Cursor c, int flags)
中的 FLAG_REGISTER_CONTENT_OBSERVER 标志。
这种方法比较正规,但是有一定的开销。而且要谨慎使用cursor.requery和 CursorAdapter (Context context, Cursor c, boolean autoRequery),autoRequery传入true。
这些已经被废弃的方法会在UI线程中执行数据查询和更新,有可能导致应用显示缓慢甚至ANR。
还有一种轻巧的方法,当该数据库只由你自己操作时,可以在adapter中使用一个数组boolean[]或者集合list<boolean>来手动管理ListView的CheckBox状态,不必在每次改变后重新查询数据并刷新界面,开支会减小很多。
2.我在这里选择了第一种方法,创建了一个ContentObserver来监听数据库,并在每次改变时刷新ListView的adapter。这样导致了第二个问题:当点击CheckBox之后,程序不停地刷新界面,进入死循环。
这个bug原因相当的简单:当改变数据库刷新ListView时会对每一个CheckBox进行setchecked(boolean),而setChecked(boolean)又触发OnCheckChangedListener从而再次更新数据库,导致死循环。
一个简单避开这个bug的方法就是改变监听的方式。当监听CheckChanged时,刷新列表时setChecked(boolean)会触发监听,可以改为监听click事件来避开这个问题,使用setOnClickListener,在每次点击CheckBox后直接反转数据库中该位置的数据(0,1互换)即可。
如果有任何需要交流的问题,请给我留言。
- 大小: 28.8 KB
分享到:
相关推荐
而当需要在ListView的每一项中加入可选的复选框(Checkbox)时,我们通常会涉及到`android listview + checkbox`的组合使用。这个组合允许用户对列表中的每一项进行选择,常见于多选操作场景,如设置、过滤器选择等...
在Android中,通常使用`ArrayAdapter`或`CursorAdapter`将数据集映射到ListView。在Web中,这可能涉及到DOM操作和Ajax请求。 7. **状态保存**: - 用户选择的状态需要在界面刷新或应用关闭后能够恢复。这可能需要...
9. **自定义ListView Item布局**:创建一个XML布局文件,包含一个TextView显示数据以及一个CheckBox,将这个布局文件在Adapter中使用。 10. **性能优化**:在大数据量列表中,可以考虑使用CursorAdapter配合SQLite...
而“带checkbox的listview”是指在每个ListView的列表项中嵌入复选框(Checkbox),以供用户进行多选操作,如选择、勾选等。这种设计常见于需要用户选择多个项目的场景,如设置菜单、联系人选择等。 ### 1. ...
此源码项目"Android应用源码之ListView+CheckBox UI 完美版"专注于如何在ListView中集成CheckBox,以实现用户交互功能,如全选、全不选和删除等操作,这对于构建具有用户友好的界面和功能的应用至关重要。...
在安卓开发中,ListView是用于显示大量数据列表的常用组件,而CheckBox则常用于实现多选功能。这个压缩包提供了一个完整的示例,展示了如何在ListView中集成CheckBox,并实现全选、全不选以及删除等功能。以下是这个...
在这个非完整的项目中,我们看到开发者尝试实现一个带有删除功能的ListView,同时每个单元格内还绑定有下拉列表控件以及文本框控件,这涉及到自定义Adapter、事件监听以及UI组件的嵌套使用。 1. **自定义ListView**...
ListView的灵活性非常高,开发者可以自定义每个列表项的布局,以及在每个列表项中放置不同类型的控件(如TextView、ImageView、CheckBox等)。 ### 开发全过程 从描述中提到的“经过几天的请教,查找等,艰辛的过程...
6. **适配器与ListView中的CheckBox**:在ListView中使用CheckBox时,通常需要结合Adapter类,如ArrayAdapter或CursorAdapter。每个ListView项都可以包含一个CheckBox,通过Adapter的getView()方法来设置每个...
在ListView中实现单选,通常采用CheckedTextView或者在每个列表项中添加一个CheckBox。通过设置单选模式,当用户点击某一项时,其他项自动取消选中。 ```java listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE)...
在这个"ListViewCheckBox"主题中,我们将深入探讨如何在ListView中集成CheckBox控件,实现复选列表的功能。 1. **ListView基础** - ListView是Android提供的一个可滚动视图,用于显示一列具有相同布局的项目。通过...
在Android中,我们可以使用BaseAdapter、SimpleAdapter或CursorAdapter等自定义Adapter来实现这一功能。 3. **全选和全不选**: - 实现全选通常需要一个全局变量来跟踪当前是否所有项都已选中。当用户点击一个...
在这个demo中,开发者可能使用了BaseAdapter或CursorAdapter来连接数据和ListView的视图。 3. **多选模式**:为了实现多项选择,通常会使用` CHOICE_MODE_MULTIPLE `或` CHOICE_MODE_MULTIPLE_MODAL `模式。前者...
在Android开发中,ListView是一种常用的组件,用于展示可滚动的多行数据列表。为了实现更加灵活和丰富的界面展示,我们通常需要对ListView进行自定义,这涉及到自定义Adapter的使用。自定义Adapter允许我们根据需求...
在Android开发中,ListView是一种常用的组件,用于展示大量的列表数据。在某些应用场景中,我们可能需要用户能够选择多个ListView中的项,例如在设置菜单、联系人选择等场景。本篇文章将详细讲解如何实现ListView的...
这个"android listview 例子"着重展示了ListView在实际应用中的复杂使用方式,特别是如何在一个ListView中包含各种不同的控件,以实现丰富的界面效果。 ListView的工作原理基于Adapter模式,Adapter是连接数据源和...
同时,为了支持全选/反选功能,我们需要在每个列表项中添加一个CheckBox,并在CheckBox的点击事件中更新选中状态。 接着,我们来设计数据模型。每个节点应包含自身的数据(如ID、名称),以及是否被选中的标志(is...
在Android开发中,ListView是应用中最常用的控件之一,它用于展示大量的数据列表。然而,随着数据量的增加,ListView可能会出现性能问题,如滚动不流畅、内存消耗过大等。因此,对ListView进行性能优化至关重要。...
本项目"Android应用源码之ListViewAndCheckBox"聚焦于如何在ListView中集成CheckBox,实现用户可以选择列表中的项。这种功能常见于多选列表场景,如设置、联系人管理等应用。 首先,我们来看ListView的基本使用。...
在布局文件中,我们需要为ListView的每一项定义一个包含CheckBox的布局。CheckBox通常与一个TextView或其他视图一起使用,以展示与之相关的数据。同时,我们还需要为全选/全不选功能创建两个按钮,并在按钮的点击...