You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用新数据刷新Fragment:新增数据后TableLayout消失且无新数据问题求解

问题原因
  • Refresh方法逻辑残缺:方法内部仅创建了TableRow实例、设置了对应文本,但完全没有将生成的TableRow添加到TableLayout容器中,即便调用Refresh方法也无法渲染新条目。
  • 列表页布局实例错误:新增条目后返回列表时,你使用inflater.inflate()重新创建了一个fragment_device布局实例,这个新实例的TableLayout从未执行过数据填充逻辑,原有的列表数据不会同步到新布局上,因此返回后看到的TableLayout是空的。
  • TableLayout实例不统一:你在onCreateView中将TableLayout定义为局部变量,Refresh方法无法访问到当前显示的TableLayout实例,无法完成新增行的操作。
修复方案
  1. 把TableLayout调整为Fragment的成员变量,确保全局可访问
public class Device extends Fragment {
    // 新增成员变量
    private TableLayout tableLayout;
    // 原有其他成员变量保留
    final Calendar myCalendar = Calendar.getInstance();
    TextView CalendarTxt, TimeTxt;
    EditText ReminderTxt;
    // ... 剩余原有代码
  1. 重写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();
    }
}
  1. 调整布局切换逻辑,返回列表时不要新建布局实例
    删除AddNotifBtn点击事件中View oldView = inflater.inflate(R.layout.fragment_device, container, false);这行代码,将ProceedBtn点击事件中新增完成后的切换逻辑修改为:
// 删除原有两行错误代码
// placeholder.removeAllViews();
// placeholder.addView(oldView);
// 替换为下面两行
placeholder.removeView(newView);
Refresh();
  1. 简化onCreateView逻辑,删除原来重复的TableLayout填充代码,直接调用Refresh()即可
    把onCreateView里原来从Cursor data = db.rawQuery(...)到data.close()之间的填充代码删掉,替换为一行Refresh();即可。

内容的提问来源于stack exchange,提问作者user15473634

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 13:57:02