如何在通知调用的对话框后将数据添加到listview?

时间:2015-06-10 17:32:41

标签: java android listview

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

 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中,但我需要在Fragment中刷新我的listview,我正在使用ViewPager。

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

这是屏幕年表: Step 1 Step 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();
}

如果用户在第二个对话框中按下添加项目,我的方法将被校准

 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();

这是NullPointerExeption,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 个答案:

答案 0 :(得分:0)

您的问题不是尝试添加到列表中,而是了解生命周期。在我看来,你没有设置片段,或者可能有你正在使用的片段库的交叉路径。您的错误是v4.Support.Fragment。确保你到处都使用同一个类。即使打开它。 (检查你的进口。确保它们都是v4)。

同时检查您的MainActivity是否未展开ActivityFragmentActivity

之后,如果您尝试通知您的应用,那么您的最佳解决方案将是BroadcastReceiver