在DialogFragment dbflow插入后,在片段中刷新适配器

时间:2016-07-20 04:06:14

标签: java android android-layout android-recyclerview recycler-adapter

我有一个活动,其上有3个片段,其中一个名为“TaskFragment”。

在我的主要活动中,我只加载片段。 在TaskFragment中,我有一个工作正常的RecyclerView,并按预期显示这些项目。

问题来了,当我使用DialogFragment插入数据时,因为它确实插入数据(我正在使用DbFlow ORM),但它(当然)不刷新适配器,因为它位于DetailMainActivity活动内的TaskFragment片段中正如我所说。

我尝试使用onResume()和onPause()来刷新适配器,但是从不调用它们,因为活动没有被暂停,或者在forogume中没有调用DialogFragment。

我已经尝试过使用一个界面,但它不起作用,我搜遍了所有的stackoverflow和谷歌没有运气。

我在这里留下一些代码供您更好地理解:

DetailMainActivity.java 在onClick界面中,我向用户显示DialogFragment以输入信息。

FragmentManager fm = getSupportFragmentManager();
                AddSimpleTask sptask = new AddSimpleTask();
                sptask.show(fm, "tag");

TaskFragment.java 在这个片段中,我有我的RecyclerView

private void setupRecyclerView() {
        mRecyclerView.setAdapter(adapter);
        mRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 2));
        mRecyclerView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (DetailMainActivity.FAB_Status) {
                    DetailMainActivity.hideFAB();
                    DetailMainActivity.FAB_Status = false;
                }
                return false;
            }
        });
    }

    private void setupAdapter() {

 adapter = new DetailMainTaskAdapter(simpleTaskList, this);
    }

AddSimpleTask 这是我的DialogFragment。我已经设置了一个setOnShowListener(),以避免DialogFragment提前解除。

@Override
    public void onShow(DialogInterface dialogInterface) {
        final AlertDialog dialog =(AlertDialog) getDialog();
        if (dialog != null){
            Button positiveButton = dialog.getButton(Dialog.BUTTON_POSITIVE);
            Button negativeButton = dialog.getButton(Dialog.BUTTON_NEGATIVE);

            positiveButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    if (mEditTextName.getText().toString().trim().isEmpty() ||
                            mEditTextContent.getText().toString().trim().isEmpty() ) {
                        if (mEditTextName.getText().toString().trim().isEmpty()) {
                            mEditTextName.setError("Can not be empty");
                        }

                        if (mEditTextContent.getText().toString().trim().isEmpty()) {
                            mEditTextContent.setError("Can not be empty");
                        }
                    }else {
                        presenter.beingInsertion(mEditTextName.getText().toString().trim(), mEditTextContent.getText().toString().trim()
                                , foreignId);
                    }
                }
            });

            negativeButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dismiss();
                }
            });
        }
    }

如果成功实现了插入,则调用onInsertSuccess方法(我正在使用MVP)

@Override
    public void onInsertSuccess() {
        Snackbar.make(getActivity().findViewById(R.id.containerMainDetail), "Actividad agregada", Snackbar.LENGTH_SHORT).show(); 
        dismiss();
    } 

我在很多地方调用过adapter.notifyDataSetChanged(),我也尝试过使用自定义界面,但是我无法使其工作。

很抱歉这篇长篇文章,但请提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

你的陈述中有一些错误,但我稍后会谈到。 notifyDataSetChanged()仅通知适配器基础列表(或数组)已更改。这意味着您首先需要在调用适配器上的notifyDataSetChanged()之前重新查询数据库并获取新列表,否则没有任何意义,因为基础列表仍然是相同的并且它不会更新适配器。

调用此方法的正确方法是通过自定义侦听器接口而不是onPause()/onResume()回调,因为用户可能没有输入值,因此您将不必要地查询数据库。在自定义侦听器接口实现中,首先使用数据库中的新数据更新列表,然后通知适配器。

假设当您的Activity被DialogFragment覆盖时,onPause()/onResume()回调不会发生,这会导致错误 - 这是不正确的。活动视图部分覆盖的那一刻,将触发onPause()回调。