Android AlertController的小bug?
来源:互联网 发布:淘宝大额优惠券链接 编辑:程序博客网 时间:2024/06/03 15:14
上周五在帮一个实习生调试程序的时候发现了这个问题,他当时想实现一个这样的功能:当用户选择删除时,以dialog的方式弹出数据列表,并且每个数据都有一个checkbox,用户选择后可以进行删除过滤。具体的接口是:
- public AlertDialog.Builder setMultiChoiceItems (Cursor cursor, String
- isCheckedColumn, String labelColumn,
- DialogInterface.OnMultiChoiceClickListener listener)
其中参数cursor是从数据库中查找返回的结果,isCheckedColumn对应数据库中一列的名称,该项为整型值,0代表为选中,1代表选中,labelColumn代表UI显示的字段,listener为注册的点击监听器。然后需要实现下面的函数接口:
- public abstract void onClick (DialogInterface dialog, int which, boolean
- isChecked)
- public abstract void onClick (DialogInterface dialog, int which, boolean
- isChecked)
其中参数dialog为你创建的对话框,which表示你点击的表项在list中的位置,isChecked表示该项是否被选中。
当时查询的结果也能显示出来,但是点击的checkbox没有变化,加了log之后发现isChecked已经为true了,也就是说应该显示被选中的状态。仔细看了下文档,发现没有使用不对的地方,最后只能查看framework中的实现代码了,初开始以为是点击的事件触发了,只是UI没有更新而已。
但是listview中实现的代码如下(frameworks/base/core/java/android/widget/CursorAdapter.java):
- adapter = new CursorAdapter(mContext, mCursor, false) {
- private final int mLabelIndex;
- private final int mIsCheckedIndex;
- {
- final Cursor cursor = getCursor();
- mLabelIndex = cursor.getColumnIndexOrThrow(mLabelColumn);
- mIsCheckedIndex = cursor.getColumnIndexOrThrow(mIsCheckedColumn);
- }
- @Override
- public void bindView(View view, Context context,
- Cursor cursor) {
- CheckedTextView text = (CheckedTextView) view.findViewById
- (R.id.text1);
- text.setText(cursor.getString(mLabelIndex));
- listView.setItemChecked(cursor.getPosition(),
- cursor.getInt(mIsCheckedIndex) == 1);
- }
- @Override
- public View newView(Context context, Cursor cursor,
- ViewGroup parent) {
- return mInflater.inflate(R.layout.select_dialog_multichoice,
- parent, false);
- }
- };
这个函数会在任何事件触发的时候都会调用的重新bind的动作,其中listView.setItemChecked(cursor.getPosition(), cursor.getInt(mIsCheckedIndex) == 1);是用来设置checkbox状态的,原来每次都根据数据库mIsCheckedIndex该列的值来决定是否选中的,所以我首先想到的是我应该在上面onClick被调用的时候去更新数据库。
可是结果并没有我想象的那样发生,UI仍然没有更新。但是我查数据库发现里面的值已经进行了修改,会不会没有重新调用查询?于是我看到CursorAdapter的第三个参数,或许看到它的使用注释你就明白了:
public CursorAdapter (Context context, Cursor c, boolean autoRequery)
Constructor
Parameters
于是乎我们把第三个参数改为true就ok了。开发Android的程序员也是人,是人都会犯点小错误的,希望对有可能使用这个控件的人有所帮助:)
- Android AlertController的小bug?
- Android AlertController的小bug?
- android源码浅析--AlertController
- android源码浅析--AlertController
- alertController
- AlertController
- AlertController工具类的封装,让AlertController变得更简单
- Android 曾经的小Bug(常识)
- Android:android中seekBar控件的一个小bug
- alertController的封装(在TYAlertController基础上封装)
- ORACLE的小BUG?
- jacob 的小bug
- 小bug的解决
- logrotate 的小bug
- Cfile的小BUG
- offset的小bug
- PostgreSQL 的小bug
- LoadRunner的小bug
- 扩展CodeIgniter系统核心类
- 为快捷方式文件(lnk文件)右键菜单添加“打开所在文件夹”
- Tomcat
- iOS使用外置TTF字体
- linux下SVN迁移时忘记了用户名和密码的解决办法,host key verification failed!
- Android AlertController的小bug?
- Apache中多任务并发处理机制研究(1)
- 手动清除explorer.exe病毒
- 站长运营网站多以失败而告终的根源在哪里
- 黑马程序员_java集合(2) 泛型&数组与集合工具类
- 分享不是让你去做,而是让你知道
- 1037. Magic Coupon
- CPU转接卡引起的故障
- 设置日期控件DatePickerDialog的用法