Android Studio中不重载Activity更新GridView列表项背景色方案咨询
你当前直接调用notifyDataSetChanged不生效的核心原因是修改数据库后未同步更新内存中Adapter绑定的List集合内对应数据的状态,同时你的SQL更新语句存在语法错误,按以下步骤修改即可实现无Activity重启的UI刷新:
步骤1:修复SQLiteHelper的更新语句错误
你当前的update语句重复定义了两次card_scanning_status字段,属于语法错误,修改excludeData方法:
public void excludeData(int i, int status) { // 状态反转 int targetStatus = status == 0 ? 1 : 0; int idd = i+1; SQLiteDatabase database = getWritableDatabase(); // 删掉重复的字段声明 String sql = "UPDATE CgList SET card_scanning_status = ? WHERE id = ? "; SQLiteStatement statement = database.compileStatement(sql); statement.bindLong(1, targetStatus); statement.bindLong(2, idd); statement.execute(); database.close(); }
步骤2:修改弹窗点击逻辑,同步更新内存数据
修改InventoryList Activity中SweetAlert的setCancelClickListener逻辑,移除Activity跳转代码,更新对应列表项数据后调用刷新即可:
.setCancelClickListener(new SweetAlertDialog.OnSweetClickListener() { @Override public void onClick(SweetAlertDialog sDialog) { if (id_image.length ==1){ Toasty.error(getApplicationContext(),"Update data first ", Toasty.LENGTH_SHORT).show(); sDialog.dismiss(); } else{ // 更新数据库状态 sqLiteHelper.excludeData(i,status); // 同步更新内存中对应Inventory对象的状态 Inventory targetItem = list.get(i); targetItem.setStatus(status == 0 ? 1 : 0); // 刷新列表,也可以调用adapter.notifyDataSetChanged()刷新全部,性能要求高可以只刷新对应项 adapter.notifyDataSetChanged(); // 弹出原逻辑的成功提示 Toasty.success(InventoryList.this,DialogStatus+"d", Toasty.LENGTH_SHORT).show(); sDialog.dismiss(); } } })
可选优化项
当前Adapter的getView方法每次执行都会查询DarkMode状态的数据库,频繁触发会影响列表滑动流畅度,建议将DarkMode状态查询逻辑移到Activity的onCreate中执行,将结果作为参数传给Adapter,无需每次绘制列表项都查库。
内容的提问来源于stack exchange,提问作者CarlJade
相关产品推荐
相关产品推荐

