如何用新数据刷新Fragment:新增数据后TableLayout消失且无新数据问题求解
问题原因
- Refresh方法逻辑残缺:方法内部仅创建了TableRow实例、设置了对应文本,但完全没有将生成的TableRow添加到TableLayout容器中,即便调用Refresh方法也无法渲染新条目。
- 列表页布局实例错误:新增条目后返回列表时,你使用
inflater.inflate()重新创建了一个fragment_device布局实例,这个新实例的TableLayout从未执行过数据填充逻辑,原有的列表数据不会同步到新布局上,因此返回后看到的TableLayout是空的。 - TableLayout实例不统一:你在
onCreateView中将TableLayout定义为局部变量,Refresh方法无法访问到当前显示的TableLayout实例,无法完成新增行的操作。
修复方案
- 把TableLayout调整为Fragment的成员变量,确保全局可访问
public class Device extends Fragment { // 新增成员变量 private TableLayout tableLayout; // 原有其他成员变量保留 final Calendar myCalendar = Calendar.getInstance(); TextView CalendarTxt, TimeTxt; EditText ReminderTxt; // ... 剩余原有代码
- 重写Refresh方法,补充清空旧数据、添加新行、绑定点击事件的逻辑
public void Refresh() { SQLiteDatabase db = getActivity().openOrCreateDatabase("NotificationDatabase", android.content.Context.MODE_PRIVATE, null); // 先清空TableLayout已有数据行,保留表头(如果没有表头可直接调用removeAllViews()) if (tableLayout.getChildCount() > 1) { tableLayout.removeViews(1, tableLayout.getChildCount() - 1); } Cursor data = db.rawQuery("SELECT * FROM PersonalNotif", null); Log.d("Count", String.valueOf(data.getCount())); if (data.getCount() > 0) { data.moveToFirst(); do { View tableRow = LayoutInflater.from(getContext()).inflate(R.layout.table_item, null, false); TextView name = (TextView) tableRow.findViewById(R.id.TblItemName); TextView date = (TextView) tableRow.findViewById(R.id.TblItemDate); name.setText(data.getString(0)); date.setText(data.getString(1)); // 将行添加到TableLayout tableLayout.addView(tableRow); // 绑定删除点击事件 tableRow.setOnClickListener(v -> { AlertDialog alertDialog = new AlertDialog.Builder(getActivity()) .setIcon(android.R.drawable.ic_dialog_alert) .setTitle("是否删除提醒:" + name.getText().toString()) .setMessage("确认后将删除选中的提醒") .setPositiveButton("删除", (dialogInterface, i) -> { db.delete("PersonalNotif", "NameOfNotif=? and TimeOfNotif=?", new String[]{name.getText().toString(), date.getText().toString()}); Refresh(); }) .setNegativeButton("取消", null) .show(); }); } while (data.moveToNext()); data.close(); } }
- 调整布局切换逻辑,返回列表时不要新建布局实例
删除AddNotifBtn点击事件中View oldView = inflater.inflate(R.layout.fragment_device, container, false);这行代码,将ProceedBtn点击事件中新增完成后的切换逻辑修改为:
// 删除原有两行错误代码 // placeholder.removeAllViews(); // placeholder.addView(oldView); // 替换为下面两行 placeholder.removeView(newView); Refresh();
- 简化onCreateView逻辑,删除原来重复的TableLayout填充代码,直接调用Refresh()即可
把onCreateView里原来从Cursor data = db.rawQuery(...)到data.close()之间的填充代码删掉,替换为一行Refresh();即可。
内容的提问来源于stack exchange,提问作者user15473634
相关产品推荐
相关产品推荐

