我修复了我的Android代码,但我想知道旧版本有什么问题

时间:2014-01-08 20:23:32

标签: android listview checkbox onclick oncheckedchanged

我有一个包含复选框和textview的列表视图,我已经将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);
     }

我没有更多问题。但我想知道为什么这个改变状态的听众采取了这样的行动?

2 个答案:

答案 0 :(得分:1)

您在checkbox内有ListView因为ListView重复使用视图效率相同的复选框对象可能提供给多个ListView项目,当检查相同时,复选框将取消选中另一个复选框。

答案 1 :(得分:1)

这个更改状态监听器只有当你滚动一个listview时才采取行动,因为它的getview再次调用会改变检查复选框的状态,因此checkchangedlistner调用会改变数据库中的值。当您使用onclick时,您的问题已解决,因为您更改listview视图onclick事件不会触发,而不会更改您的数据库值。

您可以使用listview中的viewholder来解决此问题。