RecyclerView 不会立即显示插入的 SQLite 数据

2024-01-11

当用户从FragmentDialog将他的数据输入编辑文本并按保存按钮,数据应立即显示在recyclerView,但这并没有发生。要获取/显示最新数据,您必须重新启动应用程序

我使用了一个临时解决方案,我从FragmentDialog to the mainActivity通过接口,然后我直接将该数据传递到 recyclerView 的数组列表中。这可行,但看起来不像一个合适的解决方案。我希望有一个“正确”的方法来做到这一点

我还尝试设置adapter.notifyDataSetChanged();不同的地方都没有成功

DialogFragment 类,用户在其中输入数据,然后将其插入 SQLite 数据库

public class DialogAdd extends DialogFragment {

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    final View rootView = inflater.inflate(R.layout.add_productdialog,container, false);



    name = (EditText) rootView.findViewById(R.id.dialog_productname);
    quantity = (EditText) rootView.findViewById(R.id.dialog_qantity);
    location = (EditText) rootView.findViewById(R.id.dialog_location);
    normalPrice = (EditText) rootView.findViewById(R.id.dialog_normalPrice);
    offerPrice = (EditText) rootView.findViewById(R.id.dialog_offerPrice);

    okButton = (Button) rootView.findViewById(R.id.dialog_okButton);
    okButton.getBackground().setColorFilter(Color.parseColor("#2fbd4b"), PorterDuff.Mode.MULTIPLY);
    okButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            if (name.getText().toString().isEmpty()) {
                Toast.makeText(context, "You must add a name", Toast.LENGTH_LONG).show();
            } else {


                DialogAddListener addListener = (DialogAddListener) getActivity();

                dbHelper.insertData(name.getText().toString(), quantity.getText().toString(), location.getText().toString(), normalPrice.getText().toString(), offerPrice.getText().toString());
                addListener.getDialogData(name.getText().toString(), quantity.getText().toString(), location.getText().toString(), normalPrice.getText().toString(), offerPrice.getText().toString());


                getDialog().dismiss();
            }


        }
    });

    return rootView;

}

实例化recyclerview、sqlite和适配器的mainActivity类.

public class MainActivity extends AppCompatActivity implements DialogAdd.DialogAddListener{



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.shoppinglist_mainactivity);



    databaseHelper = new DatabaseHelper(this);

    addbutton = (ImageButton) findViewById(R.id.addbtn);
    addbutton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dialogAdd = new DialogAdd();
            dialogAdd.show(getSupportFragmentManager(), "addDialog");
        }
    });



    //RecyclerView
    recyclerView = (RecyclerView)findViewById(R.id.rv_shoppinglist);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(App.getAppContex());
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(linearLayoutManager);



    initializeData();
    adapter = new ShoplistAdapter(shopListItems);
    recyclerView.setAdapter(adapter);
    adapter.notifyDataSetChanged();

}



private void initializeData(){

    shopListItems = new ArrayList<>();
    resultset = databaseHelper.getAllData();

    if (resultset.moveToFirst()){
        while(!resultset.isAfterLast()){
            shopListItems.add(new ShopListItem(resultset.getString(1), resultset.getString(2), resultset.getString(3), resultset.getString(4), resultset.getString(5)));
            resultset.moveToNext();

            totalPrice.setText("Total cost: $" + "26");
            totalItems.setText("Total items: " + resultset.getCount());
        }
    }
    resultset.close();
}


//This is only used to show the data instantly
@Override
public void getDialogData(String name, String qty, String location, String price1, String price2) {
    shopListItems.add(new ShopListItem(name, qty, location, price1, price2));
}

}


你应该使用游标加载器 http://developer.android.com/reference/android/content/CursorLoader.html它会自动监听变化Uri。并通过以下方式通知更改contentResolver.notifyChanged(uriOfInsertedData)。野兽的方法是使用ContentProvider使这一切正常工作。

或者更简单的方法是,在数据库的单例中注册一个观察者,并在更改时通知它。一般来说,这会做同样的事情,并且组件之间不会有任何关系。发布需要一些代码,所以我希望你能弄清楚。

更新2016-03-09,根据您的评论

如果您实现了示例 1,它不会告诉您如何监视更改。对于这种情况,目前还没有机制。

实现这种机制的最佳方法是使用观察者模式。

我会选择一个托管观察者的单例。

你可以延长可观察的 http://developer.android.com/reference/java/util/Observable.html(它已经具有存储观察者列表、通知和删除它们的逻辑)并使其成为单例。

通过调用注册观察者addObserver()无论您需要在哪里收听(不要忘记致电deleteObserver()以避免活动泄漏)。

现在,每当你打电话时insert或以任何方式修改数据库,请务必致电notifyObservers("tablename") of Observable单例。

这样,所有观察者都会收到表已修改的通知(传递表名称是一个示例,您可以使用其中的任何对象来通知组件有关更改的信息)

Then in update()你的Observer,检查您要监视的表是否已更新,如果是,请像平常一样重新加载数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RecyclerView 不会立即显示插入的 SQLite 数据 的相关文章

随机推荐

  • 为什么 du 或 echo 流水线不起作用?

    我正在尝试对当前目录中的每个目录使用 du 命令 所以我尝试使用这样的代码 ls du sb 但它没有按预期工作 它仅输出当前 的大小目录仅此而已 echo 也是同样的情况 ls echo 输出空行 为什么会发生这种情况 使用管道发送输出
  • 如何在 Java 中创建 PKI

    我想创建存储在数据库中的证书 但我不知道如何做到这一点 如果退出 API 或库可以帮助我做到这一点 谢谢 公钥基础设施不仅仅是签名公钥的数据库 例如 PKI 最重要的部分之一是使用 OCSP 协议撤销证书的能力 简而言之 用 java 构建
  • 将曲线拟合到数据集

    我有一个包含两个数据集的图 它产生轻微的梯度 其中最佳拟合曲线可能会被过度绘制 目前我只能得到一条最适合的直线 我明白scipy optimize curve fit应该能够帮助我 但这需要我知道我想要过度绘制的函数 我认为 下面是我的代码
  • 如何以编程方式隐藏/禁用 Android 软键盘上的表情符号

    是否可以隐藏特定的键盘按钮 我有一个EditText在某些设备上 其键盘上有笑脸 而在其他设备上则没有 我想在所有设备上隐藏它 下面是我的 XMLEditText android id id text editor android layo
  • 我应该如何在我的 ApplicationController 中使用 Draper?

    我的问题涉及以下开发堆栈 轨道3 2 1 德雷珀 0 14 血统1 2 5 我想做的是将导航传递到我的布局 所以我在我的过滤器中定义了一个之前的过滤器ApplicationController class ApplicationContro
  • MySQL 8 创建新用户,密码不起作用

    我使用 MySQL 已经好几年了 创建新用户直到 MySQL 5 x 版本的命令如下 GRANT ALL PRIVILEGES ON TO username localhost IDENTIFIED BY password 最近我安装了 M
  • 如何设置 Spring Boot 来运行 HTTPS / HTTP 端口

    Spring Boot 有一些属性来配置 Web 端口和 SSL 设置 但是一旦设置了 SSL 证书 http 端口就会变成 https 端口 那么 如何让两个端口同时运行 例如 80 和 443 正如您所看到的 只有一个端口的属性 在本例
  • 将视图添加到constraintLayout,其约束类似于另一个子项

    I have a constraint layout alpha9 with views spread all over it and I have one particular ImageView that I need to repli
  • 如何使用 LINQ 获取用户之间的最新消息?

    我有一个表显示消息之间的关系 像这样 我想获取每个用户的最后一条消息 因此 例如 结果将是表中的 id 91 和 id 92 var messages await dbContext Messages Include x gt x User
  • 安装 MongoDB java 驱动程序

    我对 Java 和 MongoDB 世界都很陌生 我想使用 MongoDB 和 Java 我已经下载了 Java 版 MongoDB 驱动程序 这是一个 jar 文件 我的问题是如何使用这个 Jar 文件 我使用了这个命令 但出现错误 ja
  • 使用 javascript 链接下载 PhantomJS

    我正在尝试抓取以下网站 如果您单击表格右上角标题为 导出数据 的小按钮 则会运行 JavaScript 脚本 并且我的浏览器会下载 csv 格式的文件 我希望能够编写一个 PhantomJS 脚本来自动执行此操作 有任何想法吗 上面的按钮被
  • 如何在 Javascript 中删除“mouseup”事件监听器

    在这里 我拖动一个元素并放到另一个地方 如果我不使用事件侦听器 它会很好地工作 但如果我以这种格式使用它 它不会执行 放置 操作 此链接包含我的代码 带有事件监听器 访问http jsfiddle net vishwateja2000 wH
  • 在 iPad 版 SDK 3.2 中使用 MPMoviePlayerViewController

    我开发了一个 iPhone 应用程序 它运行 MPMoviePlayer 3 2 SDK 之前的版本 没有任何问题 我知道这是一个新手问题 但如何让电影在新的 MPMoviePlayerViewController 中播放 我只收到音频并希
  • 的开始/结束外观转换的调用不平衡

    当我模拟我的应用程序时 我遇到了这个问题 它不是错误或警告 但它出现在我的控制台中 以前有人遇到过这种情况吗 就我而言 当您非常快速地单击表格视图中的两个选项卡时 就会发生此错误 结果导致标题名称错误 后退按钮消失 有人提到 当你推送视图时
  • 让 ASP.MVC2/VS2010 应用程序在 IIS 7.5 中工作

    我最近下载了 VS2010 beta 2 并开始使用 ASP NET MVC2 最初的开发是使用 Casini 完成的 但现在我想从 IIS 7 5 运行该应用程序 我运行的是 Windows 7 我已经安装了 IIS6 元数据库兼容性 并
  • 使用 Python 通过 Binance API 进行交易时出现问题

    我试图在不使用外部库的情况下在美国版 Binance API 上进行交易 我可以使用 GET 请求成功获取价格并显示我的帐户余额urllib 第一个示例代码有效 我可以通过我的API KEY and SECRET KEY没有问题 这些值是私
  • 我什么时候应该关心 std::iostream::sentry?

    网上参考资料对目的的描述相当简短和模糊std iostream sentry 我什么时候应该关心这个小动物 如果只是为了内部使用 为什么要公开呢 每当您需要使用流提取或输出数据时 都会使用它 也就是说 每当你创建一个operator gt
  • 如何在 JavaFX 中设置选项卡名称大小

    我有这个简单的选项卡示例 primaryStage setTitle Tabs Test Group root new Group Scene scene new Scene root 600 500 Color WHITE TabPane
  • 如何在servlet中使用依赖注入?

    如何将对象注入到 servlet 中 我的意思是 我不能使用构造函数 DI 因为 servlet 是由 servlet 容器实例化的 而且我也没有看到为 servlet 实现基于 setter 的 DI 的好方法 我应该使用 servlet
  • RecyclerView 不会立即显示插入的 SQLite 数据

    当用户从FragmentDialog将他的数据输入编辑文本并按保存按钮 数据应立即显示在recyclerView 但这并没有发生 要获取 显示最新数据 您必须重新启动应用程序 我使用了一个临时解决方案 我从FragmentDialog to