Android ListView插入数据库新数据后未实时更新问题求助
问题根因
你向数据库插入新数据后,仅更新了持久化存储的内容,没有同步更新 ListView 绑定的内存数据源,也没有通知适配器数据发生变更,因此界面不会自动刷新。重启应用时 onCreate 方法会重新拉取全量数据库数据,所以此时才能看到新插入的内容。
修改步骤
步骤1:将主活动的适配器调整为全局成员变量
你原来在 onCreate 中把适配器定义为局部变量,弹窗逻辑中无法访问,需要改为全局成员:
public class MainActivity extends AppCompatActivity { Button add,add1; ListView list; Database db; ArrayList<studentmodel> data; CustomAdapter ad; // 新增全局适配器变量 EditText roll, name, fname, student_class; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); db = new Database(this); add = findViewById(R.id.btnAdd); list=findViewById(R.id.list_item); data=db.showData(); ad=new CustomAdapter(this,data); list.setAdapter(ad); // 删掉原来多余的重复查询和notifyDataSetChanged逻辑,首次初始化不需要 } }
步骤2:插入数据成功后更新数据源并通知刷新
在弹窗的插入成功逻辑中,新增数据源更新和适配器通知代码,两种方案二选一即可:
if (i == 1) { Toast.makeText(MainActivity.this, "Data is inserted", Toast.LENGTH_SHORT).show(); // 方案1:直接追加新插入的对象到数据源,性能更高,适合仅当前页面插入数据的场景 data.add(student); ad.notifyDataSetChanged(); // 方案2:重新拉取全量数据库数据更新,数据准确性更高,适合存在其他页面修改数据库的场景 // data.clear(); // data.addAll(db.showData()); // ad.notifyDataSetChanged(); }
可选优化(非必须)
你当前的自定义适配器 getView 方法每次都重新inflate布局,没有复用View,列表滚动时会产生卡顿,可以用ViewHolder模式优化:
@NonNull @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.customlayout, parent, false); holder = new ViewHolder(); holder.adresult=convertView.findViewById(R.id.txtAddResult); holder.delete=convertView.findViewById(R.id.txtDeleteResult); holder.name=convertView.findViewById(R.id.txtName); holder.s_class=convertView.findViewById(R.id.txts_class); holder.roll=convertView.findViewById(R.id.txtRoll); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } studentmodel s1 = student.get(position); holder.name.setText(s1.getStudent_name()); holder.s_class.setText(s1.getStudent_class()); holder.roll.setText(String.valueOf(s1.getStudent_roll())); holder.adresult.setOnClickListener(v -> { Intent intent=new Intent(context,AddResult.class); context.startActivity(intent); }); return convertView; } // 新增ViewHolder内部类 static class ViewHolder { TextView adresult,delete,name,s_class,roll; }
内容的提问来源于stack exchange,提问作者Mubashar Ali
相关产品推荐
相关产品推荐

