在通知单击时将项目添加到片段内的 recyclerview

Posted

技术标签:

【中文标题】在通知单击时将项目添加到片段内的 recyclerview【英文标题】:Adding item to recyclerview inside fragment on Notification Click 【发布时间】:2017-02-23 13:09:52 【问题描述】:

场景

我在 View Pager 中有 2 个 fragments。在其中一个片段中,我有一个按钮来生成通知。通知已成功生成。现在我想在通知点击返回片段时发送一些数据。为此,我在activity 中使用onNewIntent() 方法,然后我调用片段方法将数据传回片段。

一切正常。

问题:

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

这是相关代码。

活动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);
    


片段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:尝试在空对象引用上调用虚拟方法“void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)” 在 com.testdemo.fragments.FragmentRecords.setAdapter(FragmentRecords.java:134) 在 com.testdemo.fragments.FragmentRecords.addData(FragmentRecords.java:128) 在 com.testdemo.fragments.FragmentRecords.getDataFromIntent(FragmentRecords.java:148) 在 com.testdemo.activities.MainActivity.onNewIntent(MainActivity.java:52) 在 android.app.Instrumentation.callActivityOnNewIntent(Instrumentation.java:1265) 在 android.app.Instrumentation.callActivityOnNewIntent(Instrumentation.java:1282) 在 android.app.ActivityThread.deliverNewIntents(ActivityThread.java:2755) 在 android.app.ActivityThread.performNewIntents(ActivityThread.java:2773) 在 android.app.ActivityThread.handleNewIntent(ActivityThread.java:2782) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1602) 在 android.os.Handler.dispatchMessage(Handler.java:111) 在 android.os.Looper.loop(Looper.java:227) 在 android.app.ActivityThread.main(ActivityThread.java:6102) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:961) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:822)

【问题讨论】:

你能发布错误堆栈跟踪吗? 错误是空指针,因为它没有调用 onCreateView,因此当它移动到 setAdapter 方法时,recyclerview 为空,因此它崩溃 在 onNewIntent 中,您正在创建 FragmentRecords 的新意图并在全新对象上调用 getDataFromIntent 函数。 没错,您正在与尚未启动的新片段进行交互,这就是空指针异常的原因。 那怎么解决呢?? 【参考方案1】:

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

希望对你有帮助。

【讨论】:

这正是问题所在。

以上是关于在通知单击时将项目添加到片段内的 recyclerview的主要内容,如果未能解决你的问题,请参考以下文章

单击通知时将数据发送到活动?

如何从android studio中的recycler视图将数据添加到SQLite数据库中

视图重新添加到视图寻呼机中的片段

在循环中单击另一个元素时将事件侦听器添加到元素

关于打开一个新活动以响应对片段内的 RecyclerView 项目的点击

按下锁定/主页按钮时的通知,单击返回选项卡片段时的通知