所以我有一个AsyncTask类来处理填充我的RecyclerView
。它运行良好但是当它需要刷新时它会崩溃NullPointerException
。我知道为什么然后我不能这样做,因为我正在创建一个新的object
并将其添加到我的list
。
这是我的代码:
@Override
protected void onPostExecute(String s) {
try {
userslist.clear();
JSONArray jsonArray = new JSONArray(s);
for(int i=0; i < jsonArray.length(); i++){
...
UsersData usersData = new UsersData(var1, var2);
userslist.add(UsersData);
}
cAdapter.notifyDataSetChanged(); // Culprit line, despite the list being deleted and added again in the try block
} catch (JSONException e) {
e.printStackTrace();
}
}
我怀疑它与userslist
有关。
这是我的错误日志:
java.lang.NullPointerException
at lukazs.newapp.UserInfo$GetUserList.onPostExecute(UserInfo.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)
编辑:这是方法调用,我填充recyclerview
:
public void populateRecyclerList(){
GetUserList getUserList = new GetUserList();
getUserList.execute();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
...
setContentView(R.layout.usersdetails);
populateRecyclerList();
}
这是cAdapter
方法中初始化onCreate
的地方:
RecyclerView.Adapter cAdapter;
ArrayList<UserDetailsProvider> userslist = new ArrayList<UserDetailsProvider>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
recyclerView = (RecyclerView) findViewById(R.id.recycleMusic);
cAdapter = new UserDefinedAdapter(userslist);
recyclerView.setAdapter(cAdapter);
populateRecyclerList();
}
编辑:我现在已经做了一些事情,但populateRecyclerList()
在AsyncTask class
上的另一个onPostExecute
崩溃了。基本上,我想在添加用户后重新填充recyclerView。这是我的onPostExecute()
方法的代码,我调用populateRecyclerList()
方法:
@Override
protected void onPostExecute(String s) {
populateRecyclerList();
}
也许你不打算在这里调用这个方法?但是,我如何更新RecyclerView
?
答案 0 :(得分:1)
致电cAdapter
时,您的cAdapter.notifyDataSetChanged()
未初始化。
修改强>
在初始化字段后调用populateRecyclerList()
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
recyclerView = (RecyclerView) findViewById(R.id.recycleMusic);
cAdapter = new UserDefinedAdapter(userslist);
recyclerView.setAdapter(cAdapter);
populateRecyclerList();
}
希望它有所帮助!
答案 1 :(得分:0)
我的不好,onPostExecute在UI线程上运行...谢谢你们纠正......
http://developer.android.com/reference/android/os/AsyncTask.html
“onPostExecute(Result),在后台计算完成后在UI线程上调用。后台计算的结果作为参数传递给此步骤。”