RecyclerViewAdapter.notifyDataSetChanged()在空对象的引用上。

4

当我按下返回键时,RecyclerView上的notifyDataSetChanged()出现错误。这是代码:

MainActivity.java

class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    public List<Article> articleList;
    public RecyclerView recyclerView;
    public RecyclerViewAdapter adapter;

    ArrayList<String> my_list = new ArrayList<String>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);

        initData();
        adapter = new RecyclerViewAdapter(articleList, MainActivity.this);
        recyclerView.setAdapter(adapter);
    }

      private void initData() {
        articleList = new ArrayList<>();
        queryArticle();
    }

      public void saveArticle(String title, String desc) {
        //ab is a instance for class Article_Bmob
        ab.setTitle(title);
        ab.setDesc(desc);

        ab.save(new SaveListener<String>() {
            @Override
            public void done(String s, BmobException e) {

                if(e == null) {
                } else {
                    e.printStackTrace();
                }

            }
        });

     }
}

WriteArticle.java(错误文件)

public class WriteArticle extends AppCompatActivity {
    MainActivity mainActivity;

    private String art_title, art_desc;
    private EditText edt_title, edt_desc;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.write_article);

        edt_title = (EditText) findViewById(R.id.w_art_title);
        edt_desc = (EditText) findViewById(R.id.w_art_desc);
        Button btn_send = (Button) findViewById(R.id.send_article);

        mainActivity = new MainActivity();

        btn_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                art_title = edt_title.getText().toString();
                art_desc = edt_desc.getText().toString();

                if (art_title.isEmpty()) {
                    Snackbar.make(view, "R.String.xxx", Snackbar.LENGTH_LONG)
                            .setAction("Action", null).show();
                } else if (art_desc.isEmpty()) {
                    Snackbar.make(view, "R.String.xxx", Snackbar.LENGTH_LONG)
                            .setAction("Action", null).show();
                } else {
                    mainActivity.saveArticle(art_title, art_desc);
                    mainActivity.adapter.notifyDataSetChanged();
                    finish();
                }

            }
        });

    }

错误信息:

java.lang.NullPointerException: Attempt to invoke virtual method 
'void com.myapplication.RecyclerViewAdapter.notifyDataSetChanged()' on a null object reference
at com.myapplication.WriteArticle$1.onClick(WriteArticle.java:52)

我该如何解决这个问题?


1
在创建 Activity 时,不能像这样调用它的构造函数 mainActivity = new MainActivity(); - J j
那我该怎么办? - Yi Corleone
1
你想通过 mainActivity = new MainActivity(); 实现什么目的?你想打开这个活动吗? - J j
可能是如何在Android上管理`startActivityForResult`的重复问题。 - OneCricketeer
基本上,不要创建你不需要的Activity实例。你不能仅仅像这样传递数据。或者,可以参考一下这个帖子。https://dev59.com/_nI95IYBdhLWcg3w7CjL - OneCricketeer
其他选项包括让“写入”活动将内容存储在SQLite数据库中,然后在另一个活动中读取并显示在RecyclerView中。 - OneCricketeer
1个回答

3
在你的MainActivity中。
public static MainActivity mactivity;
public static MainActivity getinstance(){
    return mactivity;
}

在您的WriteArticle活动中
MainActivity mainActivity;

并将其用作

mainActivity.getinstance.saveArticle(art_title, art_desc);
mainActivity.getinstance.adapter.notifyDataSetChanged();

这可能会起作用,但绝对不推荐这样做。活动可能会被操作系统杀掉,所以异常仍然会发生。 - OneCricketeer
那会让应用程序冻结半秒钟。为什么这有帮助呢? - OneCricketeer
没有必要这样做。但是你说活动可能会被操作系统杀死。你可以选择在意图中打包数据,并在设置适配器之前接收它。 - user6657161
你在问谁?saveArticle方法试图将数据放入适配器中。 - OneCricketeer
现在我遇到了类似的错误:java.lang.NullPointerException: Attempt to invoke virtual method 'void com.myapplication.MainActivity.saveArticle(java.lang.String, java.lang.String)' on a null object reference。你是不是指的是 return mactivity = new MainActivity(); - Yi Corleone
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接