请不要将其标记为重复,因为昨天提供的解决方案不起作用。
我填充了一个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方法。
由于
答案 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
虽然分配了变量,但它们仍可能正在初始化。
修改强>
您可以尝试将呼叫转移到顶级类别,例如
public void dataSetChangedCallback() {
adapter.notifyDataSetChanged();
}
并在您的DisplayUsersList中更改adapter.notifyDataSetChanged();到
...
dataSetChangedCallback();
...