我知道这个问题与此问题重复
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;
}
答案 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