2016-02-28 102 views
0

请不要将其标记为重复项,因为昨天提供的解决方案无效。当我更新它时,recyclerview崩溃

我填充了一个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 is adapter.notifyDataSetChanged();

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

此bug已被窃听我在我睡觉字面上 - 所以任何帮助和解决方案将意味着很多对我

编辑:我想我知道到底哪里出错 - 它是在POSTEXECUTE方法在ADDUSERS类。

感谢

+0

为什么'recyclerView.setHasFixedSize(true);'为? –

+0

我认为这是当你说你添加一个名字'......是如何完成它对准回收视图 –

+0

?它是在相同的片段/活动中,还是作为单独的片段/活动来完成?这条信息可能对适配器为什么变为空的至关重要。 – Elye

回答

0

只是检查如果适配器不为空调用notifyDataSetChanged()前:

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

这是因为的AsyncTask异步执行,并通过它完成的时候,适配器可能无法使用了。你可以尝试

+0

是的,但我想更新数据,所以它不应该是'null' –

+0

这可能不是解决办法,因为这将基本上不会使更新的数据。问题是为什么适配器为空。 – Elye

+0

是的。答案没有帮助 –

0

一个选项是不是使用

adapter.notifyDataSetChanged(); 

,与

recyclerView.getAdapter().notifyDataSetChanged(); 

这是假设无论出于何种原因更换,你有你的adapter设置为空,但不显示代码清楚地在上面,而你的recyclerview仍然完整无缺。

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

+0

仍然崩溃,我想你的解决方案过于 –

0

您正在处理主类的范围之外的变量,这个变量总是粗略的。授予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(); 
... 
+0

我试图移动方法'在onStart()'和我想你的解决方案 - 没有运气,它仍然崩溃 –

+0

你可以发布更多的解决方案,或者看到我的编辑,让我知道是否奏效? –