我有一个包含复选框和文本视图的列表视图,我已经向我的适配器添加了一个 ViewBinder,在这个 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);
     }

我没有更多的问题了。但我想知道为什么这个改变状态侦听器会那样做?

有帮助吗?

解决方案

你有这个 checkbox 里面 ListView 由于 ListView 重用视图以提高效率,因此可以将相同的复选框对象提供给多个 ListView 项目,并且当选中同一复选框时,不会选中另一个复选框。

其他提示

此更改状态侦听器仅当您滚动ListView时才能采用该方法,因为它再次更改选中的复选框状态,因此ChecionChangedListner调用数据库中的值更改。当您使用onclick时,您的问题已解决,因为在更改ListView View View View View OnClick事件,而不是未更改数据库值的触发。

您可以通过使用ListView中的视图来解决此问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top