Java 当我更新它时,recyclerview崩溃了

Java 当我更新它时,recyclerview崩溃了,java,android,android-recyclerview,android-adapter,Java,Android,Android Recyclerview,Android Adapter,请不要将其标记为重复,因为昨天提供的解决方案不起作用 我已经填充了一个recyclerview,虽然加载速度有点慢,但工作正常 但是,假设我添加一个新名称并更新recyclerview时,它会与NullPointerException崩溃 以下是类别和代码: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.l

请不要将其标记为重复,因为昨天提供的解决方案不起作用

我已经填充了一个
recyclerview
,虽然加载速度有点慢,但工作正常

但是,假设我添加一个新名称并更新
recyclerview
时,它会与
NullPointerException
崩溃

以下是类别和代码:

 protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.mainOnes);
      recyclerView = (RecyclerView) findViewById(R.id.recycleOnes);
      LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
      linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
      recyclerView.setLayoutManager(linearLayoutManager);
      recyclerView.setHasFixedSize(true);
      adapter = new MusicRecyclerAdapter(list);
      recyclerView.setAdapter(adapter);
      populateList();

}

public void populateList(){
   DisplayUsersList displayUsersList = new DisplayUsersList();
   displayUsersList.execute();
}

public class DisplayUsersList extends AsyncTask<String, String, String> {
        @Override
    protected String doInBackground(String... params) {
        ...
    }

    @Override
    protected void onPostExecute(String postData) {
        try {
            list.clear();
            JSONArray jsonArray = new JSONArray(postData);
            for(int i=0; i < jsonArray.length(); i++){
                String forename = jsonArray.getJSONObject(i).getString("forename");
                String surname = jsonArray.getJSONObject(i).getString("surname");
                UserDetails userDetails  = new UserDetails(forename, musicName, surname);
                list.add(userDetails);
            }
            adapter.notifyDataSetChanged();
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

public class AddUsers extends AsyncTask<String, String, String> {
    @Override
    protected String doInBackground(String... params) {
        ...
    }

    @Override
    protected void onPostExecute(String postData) {
        populateList();
    }
}
第218行是adapter.notifyDataSetChanged()

我尝试在
onPostExecute
中实例化
recyclerview
,但它一直崩溃。我的代码的工作原理是,它实际加载数据并将其显示在
recyclerview
中。当我再次调用
populateList()
方法时,它不会重新显示或重新加载

这个bug一直在我的睡眠中困扰着我,所以任何帮助和解决方案对我来说都意义重大

编辑:我想我确切地知道错误在哪里-它在
ADDUSERS
类中的POSTEXECUTE方法中


谢谢

在调用
notifyDataSetChanged()
之前,只需检查适配器是否为空:


之所以会发生这种情况,是因为AsyncTask是异步执行的,当它完成时,适配器可能不再可用。

您可以尝试的一个选项是,而不是使用

adapter.notifyDataSetChanged(); 
取代

recyclerView.getAdapter().notifyDataSetChanged();
这是假设无论出于何种原因,您的
适配器
已设置为空,但未在上面的代码中清楚显示,而
回收视图
仍然完好无损


p/s:我也没有看到您更新最新检索到的数据并将其插入适配器。您可能也想检查一下。

您在线程类中处理的变量超出了主类的作用域,而线程类总是粗略的。假设AsyncTask应该为您同步操作,我总是很谨慎

尝试将列表和适配器传递给DisplayUsersList类,例如

DisplayUsersList displayUsersList = new DisplayUsersList(list, adapter);
displayUsersList.execute();
public void dataSetChangedCallback() {
    adapter.notifyDataSetChanged();
}
在DisplayUsersList中,确保这些的引用是明确的,例如

public class DisplayUsersList extends AsyncTask<String, String, String> {

    private final List<UserDetails> list;
    private final Adapter adapter;

    public DisplayUsersList(List<UserDetails> list, Adapter adapter) {
        this.list = list;
        this.adapter = adapter;
    }
...
并在DisplayUsersList中更改适配器。notifyDataSetChanged();到


是的,但是我想更新数据,所以它不应该是
null
,这可能无法解决问题,因为这基本上不会更新数据。问题是为什么适配器为空。是的。答案是没有帮助的,我不知道为什么它是空的
populateList()
onCreate
onPostExecute
我认为错误在
AddUsers
classWhy is
recyclerView.setHasFixedSize(true)中的
onPostExecute
方法中用于?我以为当你说“添加名称”时是为了对齐回收器视图。。。是怎么做到的?它是在同一个片段/活动中,还是作为单独的片段/活动完成?这段信息可能是适配器变为null.Nope的重要原因。你能删除它并看看会发生什么吗?你确实做了一些事情,将适配器设置为null。我尝试将该方法移动到
onStart()
,然后我尝试了你的解决方案-不走运,它仍然会崩溃。你能发布更多的解决方案或查看我的编辑并告诉我是否有效吗?
public class DisplayUsersList extends AsyncTask<String, String, String> {

    private final List<UserDetails> list;
    private final Adapter adapter;

    public DisplayUsersList(List<UserDetails> list, Adapter adapter) {
        this.list = list;
        this.adapter = adapter;
    }
...
public void dataSetChangedCallback() {
    adapter.notifyDataSetChanged();
}
...
dataSetChangedCallback();
...