0

我有一个包含复选框和文本视图的列表视图,并且我在我的适配器中添加了一个 ViewBinder,在这个视图绑定器中,我向我的复选框添加了一个 onchecked 状态侦听器,并且在 onchecked 状态侦听器中我编写了以下代码:

OnCheckedChangeListener myCheckChangList = new OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                String id=buttonView.getTag()+"";
                int buttonid=Integer.valueOf(id);               
                if(buttonView.isChecked()==true){   
                    Log.d("checked","checked");
                myDbHelper.MarkAsFavorite(buttonid);

                }

                else if(buttonView.isChecked()==false){
                    Log.d("unchecked","unchecked");
                    myDbHelper.UnMarkAsFavorite(buttonid);
                }

                 cu=myDbHelper.GetCursor();
                 adapter.swapCursor(cu);

            }
        }; 

但是使用此代码,当我的复选框被选中时,它被保存在数据库中,然后当我滚动浏览列表视图时,它本身被取消选中,它访问未选中的代码并取消选中复选框并将其保存在数据库中。

所以我通过在复选框中添加一个 onclick 侦听器而不是 onchange 状态侦听器来修复它:

public void onclick(View view) {
         String id=view.getTag()+"";
            int buttonid=Integer.valueOf(id);               
            if(((CompoundButton) view).isChecked()==true){  
                Log.d("checked","checked");
            myDbHelper.MarkAsFavorite(buttonid);

            }

            else if(((CompoundButton) view).isChecked()==false){
                Log.d("unchecked","unchecked");
                myDbHelper.UnMarkAsFavorite(buttonid);
            }

             cu=myDbHelper.GetCursor();
             adapter.swapCursor(cu);
     }

我没有更多的问题。但我想知道为什么这个变化状态监听器会这样?

4

2 回答 2

1

只有当您滚动列表视图时,此更改状态侦听器才会这样做,因为它的 getview 调用再次更改了选中的复选框状态,因此 checkchangedlistner 调用更改了数据库中的值。当您使用 onclick 时,您的问题已解决,因为您更改了 listview 视图 onclick 事件不会触发,这不会更改您的数据库值。

您可以通过在 listview 中使用 viewholder 来解决此问题。

于 2014-01-08T20:36:22.260 回答
1

你有这个,因为checkboxListViewListView重复使用视图以提高效率,相同的复选框对象可能提供给多个 ListView 项目,并且当它被选中时,相同的复选框未选中另一个。

于 2014-01-08T20:27:43.393 回答