android - 在 Notification Click 上将项目添加到 fragment 内的 recyclerview

标签 android android-fragments view android-viewpager onnewintent

场景

我在 View Pager 中有 2 个 fragments。在其中一个 fragment 中,我有一个按钮来生成通知。通知生成成功。现在我想发送一些关于通知点击的数据返回 fragment 。为此,我在 activity 中使用了 onNewIntent() 方法,并从中调用了 fragment 方法将数据传回 fragment 。

一切正常。

问题:

从通知接收数据后,我将其添加到 arraylist 并在 RecyclerView 中显示。现在的主要问题是,在这种情况下 onCreateView() 没有被再次调用,由于这个问题, fragment 中的所有 View 都是空的,这一直导致空指针异常。 有什么方法可以在 onResume() 中获取 View 或保存对以前 View 的引用。

相关代码如下。

Activity onNewIntent()代码:

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    intent=getIntent();
    if (intent.hasExtra("notification_data")) {
        Record record = (Record) intent.getSerializableExtra("notification_data");
        FragmentRecords fragmentRecords = new FragmentRecords();
        fragmentRecords.getDataFromIntent(record);
    }

}

fragment getDataFromIntent方法:

    public void getDataFromIntent(Record record){

       DatabaseManager databaseManager=new DatabaseManager(MainActivity.context);
       recordDao = null;
       try {
           recordDao=databaseManager.getDao();
           addData();
       } catch (SQLException e) {
           e.printStackTrace();
       }
       recordArrayList.add(record);
       recordAdapter.notifyDataSetChanged();
   }

initView()方法

private void initView(View view){
    btnAddRecords= (Button) view.findViewById(R.id.btn_add_data);
    btnNotification= (Button) view.findViewById(R.id.btn_create_notification);
    recyclerRecords= (RecyclerView) view.findViewById(R.id.rv_list);
    recordArrayList=new ArrayList<>();
    DatabaseManager databaseManager=new DatabaseManager(MainActivity.context);
    recordDao = null;
    try {
        recordDao=databaseManager.getDao();
        addData();
    } catch (Exception e) {
        e.printStackTrace();
    }

addData() 方法包括将静态数据添加到数组列表中。

private void addData(){
    recordArrayList.add(new Record("Ram","1234567890","10 years","hello",1L));
    recordArrayList.add(new Record("Rahim","1234567890","12 years","hello",2L));
    recordArrayList.add(new Record("Shyam","1234567890","13 years","hello",3L));
    recordArrayList.add(new Record("Sunder","1234567890","40 years","hello",4L));
    recordArrayList.add(new Record("Demo","1234567890","14 years","hello",5L));
    recordArrayList.add(new Record("Demo1","1234567890","15 years","hello",6L));
    recordArrayList.add(new Record("Demo2","1234567890","16 years","hello",7L));
    for (int i=0;i<recordArrayList.size();i++){
        try {
            recordDao.create(recordArrayList.get(i));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    Toast.makeText(MainActivity.context, recordArrayList.size()+" records added successfully", Toast.LENGTH_SHORT).show();
   setAdapter();
}


private void setAdapter(){
       recordAdapter=new RecordAdapter(MainActivity.context,recordArrayList);
       RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(MainActivity.context);
       recyclerRecords.setLayoutManager(mLayoutManager);
       recyclerRecords.setItemAnimator(new DefaultItemAnimator());
       recyclerRecords.addItemDecoration(new SimpleItemDecorator(5));
       recyclerRecords.setAdapter(recordAdapter);


   }

错误堆栈跟踪

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' on a null object reference at com.testdemo.fragments.FragmentRecords.setAdapter(FragmentRecords.java:134) at com.testdemo.fragments.FragmentRecords.addData(FragmentRecords.java:128) at com.testdemo.fragments.FragmentRecords.getDataFromIntent(FragmentRecords.java:148) at com.testdemo.activities.MainActivity.onNewIntent(MainActivity.java:52) at android.app.Instrumentation.callActivityOnNewIntent(Instrumentation.java:1265) at android.app.Instrumentation.callActivityOnNewIntent(Instrumentation.java:1282) at android.app.ActivityThread.deliverNewIntents(ActivityThread.java:2755) at android.app.ActivityThread.performNewIntents(ActivityThread.java:2773) at android.app.ActivityThread.handleNewIntent(ActivityThread.java:2782) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1602) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loop(Looper.java:227) at android.app.ActivityThread.main(ActivityThread.java:6102) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:961) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:822)

最佳答案

正如评论中指出的那样,您正在与一个尚未启动的新 FragmentRecords 实例进行交互,而不是使用您现有的 fragment 。您应该尝试检索对现有 FragmentRecords 实例的引用(如果您使用标签来识别 fragment ,可能通过 findFragmentByTag 方法),然后调用 getDataFromIntent 在那个实例上。

希望对你有帮助。

关于android - 在 Notification Click 上将项目添加到 fragment 内的 recyclerview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42416696/

相关文章:

java - Android 应用无法再访问服务器文件

android - 使用 Rxjava 从通知到 Fragment?

xml - SAPUI5:没有在 XML View 中创建动态过滤器的选项?

android - 如何在 Xamarin Android 应用程序中将日志输出到 SD 卡上的文件?

android - Google TTS 中的俄语和德语支持

android - 如何将不同的数据添加到 3 个选项卡中的 3 个 fragment ?

java - 如何在ListView中显示 "anchor"headerview

javascript - 当我在呈现 View 后设置输入类型的值时,为什么不触发输入类型的更改事件?

java - 如何在eclipse中比较两个相同的方法?

android - ArrayAdapter<String> 中的 getPosition(item) 给出 NullPointerException