当前位置: 首页 > 知识库问答 >
问题:

如何在通过通知调用的对话框之后向listview添加数据?

亢正德
2023-03-14

我的目标是向listView添加数据,在推送通知显示对话框后,若用户按Yes,应用程序将显示带有片段的活动,然后再次显示new dialog以添加新项目。但如果我按add,我会得到:

 java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v4.app.LoaderManager android.support.v4.app.FragmentActivity.getSupportLoaderManager()' on a null object reference

将新项目添加到listview的对话框位于MainActivity中,但我需要在片段中刷新我的listview,我正在使用ViewPager。

似乎我的片段还没有初始化,但现在显示的是对话框。如何实现这个解决方案?还有一件事,我在通知中设置了AutoCancel(true),但notif仍在屏幕上。

以下是屏幕年表:步骤1步骤2

还有一张我无法添加的图片(

我的对话活动:

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    final String text = getIntent().getStringExtra("text");

    new AlertDialogWrapper.Builder(this)
            .setTitle(R.string.title_alert)
            .setMessage(R.string.title_alert)
            .setNegativeButton("No", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    finish();
                }
            })
            .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Intent intent = new Intent(DialogActivity.this, MainActivity.class);
                    intent.putExtra("notification",true);
                    intent.putExtra("text",text);
                    startActivity(intent);
                    finish();

                }
            }).show();
}

如果用户在第二个对话框中按add item,将校准的我的方法

 private void showTrackerDialog(TrackersFragment f, final String text,boolean isFromNotif) {
    final TrackersFragment trackersFragment = f;
    tracker = new Tracker();
    MaterialDialog dialog = new MaterialDialog.Builder(this)
            .title("New tracker :)")
            .customView(R.layout.add_track, true)
            .positiveText("ADD")
            .positiveColorRes(R.color.primary_light_green)
            .negativeText(android.R.string.cancel)
            .negativeColorRes(R.color.primary_red)
            .callback(new MaterialDialog.ButtonCallback() {
                @Override
                public void onPositive(MaterialDialog dialog) {
                    if (hours.getValue() == 0 && minutes.getValue() == 0 && isLimit.isCheck()) {
                        Toast.makeText(getApplicationContext(), "Please check your the input values!", Toast.LENGTH_SHORT).show();
                        return;
                    }
                    //limited
                    if ((((hours.getValue() != 0 && minutes.getValue() == 0) || (hours.getValue() == 0 && minutes.getValue() != 0))
                            || (hours.getValue()!=0 && minutes.getValue()!=0)) && isLimit.isCheck()) {
                        try {
                            hoursToMillis = Long.parseLong(String.valueOf(hours.getValue()));
                            minutesToMillis = Long.parseLong(String.valueOf(minutes.getValue()));
                            tracker.setLimitTime((hoursToMillis * 60 * 60 * 1000) + (minutesToMillis * 60 * 1000));
                            tracker.setName(name.getText().toString());
                            tracker.setElapsedTime((long) 0);
                            tracker.setIsFinished(false);
                            tracker.persist(RemindMe.db);
                            trackersFragment.updateListView(true,tracker);
                            return;
                        } catch (Exception ex) {
                            ex.printStackTrace();
                            Toast.makeText(getApplicationContext(), "Something goes wrong :(", Toast.LENGTH_SHORT).show();
                            return;
                        }
                    }
                    //no limit
                    if (!isLimit.isCheck()) {
                        tracker.setLimitTime(0L);
                        tracker.setName(name.getText().toString());
                        tracker.setElapsedTime((long) 0);
                        tracker.setIsFinished(false);
                        tracker.persist(RemindMe.db);
                        trackersFragment.updateListView(true,tracker);
                    }
                }

                @Override
                public void onNegative(MaterialDialog dialog) {
                }
            }).build();

这是NullPointerExection,getSupportLoaderManager()

 public void updateListView(boolean isAdded,Tracker tracker) {
    if(isAdded && tracker!=null){
        trackerList.add(tracker);
       getActivity().getSupportLoaderManager().getLoader(TRACKLOADER_ID).forceLoad();
        adapter.swapCursor(Tracker.getAll(db));
    }
}

共有1个答案

宇文育
2023-03-14

这里的问题不是试图添加到列表中,而是理解生命周期。在我看来,您似乎没有设置该片段,或者可能遇到了您正在使用的片段库的路径。您的错误是v4。支持。片段。确保在任何地方都使用相同的类。甚至在打开它的时候。(检查您的进口。确保它们都是v4)。

还要检查您的main活动是否没有扩展Activity,而是扩展FragmentActivity

之后,如果您试图通过通知通知您的应用程序,最好的解决方案是使用广播接收器。

 类似资料:
  • 我想用通过DataTask检索的数据填充scrollview。我用api调用的结果填充一个可编码结构。我想把键和它的值添加到应用程序中的scrollview中。 scrollview通过以下方式访问 这是我的api调用。 这是我用来填充ScrollView的方法。 现在的问题是scrollview没有显示生成的TextViews。kentekenDataObject被填充,我通过将其打印到控制台进

  • 我是新手颤动,我使用Firebase消息发送通知到设备,我们使用Web API发送请求到Firebase发送通知和Firebase发送通知到Android。我想在通知标题和身体显示两个按钮(接受和拒绝)像瓦特应用程序通知标记为已读选项我想要这样的东西。 我添加的Android清单文件: 颤振码 Web api服务代码

  • 我想将我的添加到列中,这样我就可以在加载更多项目时在这个列表视图下面添加CircularProgressIndex ator。我使用了如何在Flutter中将列表视图添加到列中的建议?因此我制作了结构列- 你能告诉我我做错了什么吗?这个构建了新的小部件,但它构建在另一个列上。也许这是错的?

  • 我想要得到一个这样的对象: 通过这样编码: 但我总是得到以下几点:

  • 我有一个Toast通知从项目外部执行(在后台)。这里有: 我的问题是当我尝试执行代码时,当用户点击toast,我想要执行部分代码从主项目。有办法做到这一点吗? 谢谢

  • 这是在一个单独的类中(不是或)。上面的工作很好,我可以看到我的MakeADialg日志消息。然而,当我试图创建一个实际的对话框,然后我得到很多崩溃。当我从C端调用到Java端时,我可以看出我并不是在摸索我在运行什么‘线程’。当我试图创建一个新的线程/对话框时,似乎遇到了麻烦。 我已经尝试了很多关于创建Runnable线程等的建议--但它们似乎总是给我一个可怕的‘无法在未调用looper.prepa