滚动时,列表视图中的开关会自动进行检查

时间:2018-06-18 08:23:50

标签: android listview switchcompat

我知道这个问题与此问题重复

Switches in listview automatically gets check android when scrolled但答案对我不起作用

当我滚动浏览listview开关自动检查时,我遇到了同样的问题。 如果数据等于'1',我的逻辑设置为开启,这是从数据库中恢复并且工作正常但是当我滚动列表时,所有开关都会被检查。

这是我的代码

public View getView(final int position, View convertView, ViewGroup parent) {
    View view = convertView;
    if(null==view){
        LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = layoutInflater.inflate(R.layout.list_item,null);
    }
    final ApplicationInfo data = appList.get(position);
    if(null !=data){
        final SwitchCompat appName = (SwitchCompat)view.findViewById(R.id.appName);
        ImageView iconView = (ImageView)view.findViewById(R.id.app_icon);
        //Read Data
        dbHelper db = new dbHelper(context);
        SQLiteDatabase database1 = db.getReadableDatabase();
        Cursor cursor = database1.rawQuery("select isLocked from apps where package='"+appList.get(position).packageName+"'",null);
        if(cursor !=null){
            cursor.moveToFirst();
            if(cursor.getInt(0) == 1){
                appName.setChecked(true);
            }
        }

        appName.setText(data.loadLabel(packageManager));
        iconView.setImageDrawable(data.loadIcon(packageManager));

        appName.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                if(b){
                    //appList.get(position).packageName
                    dbHelper dbHelper = new dbHelper(context);
                    SQLiteDatabase database = dbHelper.getWritableDatabase();
                    database.execSQL("update apps set 'isLocked'=1 where package='"+appList.get(position).packageName+"'");
                }else {
                    dbHelper dbHelper = new dbHelper(context);
                    SQLiteDatabase database = dbHelper.getWritableDatabase();
                    database.execSQL("update apps set 'isLocked'=0 where package='"+appList.get(position).packageName+"'");
                }
            }
        });
    }
    return view;
}

2 个答案:

答案 0 :(得分:2)

ListView中,滚动时会重复使用这些项目。如果已选中该复选框,则在使用之前需要取消选中该复选框。

使用:

if(cursor.getInt(0) == 1){
    appName.setChecked(true);
} else {
    appName.setChecked(false);
}

取代

if(cursor.getInt(0) == 1){
    appName.setChecked(true);
}

或者在执行其他任务之前重置/取消选中该复选框:

View view = convertView;
if(null==view){
    LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    view = layoutInflater.inflate(R.layout.list_item,null);
}

final SwitchCompat appName = (SwitchCompat)view.findViewById(R.id.appName);
appName.setOnCheckedChangeListener(null);
appName.setChecked(false);

final ApplicationInfo data = appList.get(position);
if(null !=data){
    // your code.
}

答案 1 :(得分:0)

请删除从public View getView

中分配/绑定数据的代码

并将其移至public void onBindViewHolder