2016-02-28 86 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

你可以發佈更多的解決方案,或者看到我的編輯,讓我知道是否奏效? –

相關問題