我更新它时,recyclerview崩溃了

时间:2016-02-28 13:36:47

标签: java android android-recyclerview android-adapter

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

我填充了一个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();
    }
}

我认为由于populateList()方法调用而崩溃,因为我已经初始化了所有内容

我的logcat:

java.lang.NullPointerException
            at georgezs.userdas.UserDBGUI$DisplayUsersList.onPostExecute(UserDBGUI.java:218)
            at android.os.AsyncTask.finish(AsyncTask.java:741)
            at android.os.AsyncTask.access$600(AsyncTask.java:197)
            at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:654)
            at android.os.Handler.dispatchMessage(Handler.java:100)

第218行是adapter.notifyDataSetChanged();

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

这个错误在我的睡眠中一直困扰着我 - 所以任何帮助和解决方案对我来说都意味着很多

编辑:我认为我确实知道错误在哪里 - 它是ADDUSERS CLASS中的POSTEXECUTE方法。

由于

3 个答案:

答案 0 :(得分:0)

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

if (adapter != null) {
adapter.notifyDataSetChanged();
}

这是因为AsyncTask异步执行,当它完成时,适配器可能不再可用。

答案 1 :(得分:0)

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

adapter.notifyDataSetChanged(); 

替换为

recyclerView.getAdapter().notifyDataSetChanged();

这是假设无论出于何种原因,您已将adapter设置为null,但未在上面的代码中显示,而您的recyclerview仍然完好无损。

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

答案 2 :(得分:0)

你在Threaded类中处理主类范围之外的变量,它总是粗略的。授予AsyncTask应该为您同步操作,我总是谨慎

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

DisplayUsersList displayUsersList = new DisplayUsersList(list, adapter);
displayUsersList.execute();

在你的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;
    }
...

另外,尝试移动populateList();到OnStart而不是onCreate

enter image description here

虽然分配了变量,但它们仍可能正在初始化。

修改

您可以尝试将呼叫转移到顶级类别,例如

public void dataSetChangedCallback() {
    adapter.notifyDataSetChanged();
}

并在您的DisplayUsersList中更改adapter.notifyDataSetChanged();到

...
dataSetChangedCallback();
...