Java 当我更新它时,recyclerview崩溃了
请不要将其标记为重复,因为昨天提供的解决方案不起作用 我已经填充了一个Java 当我更新它时,recyclerview崩溃了,java,android,android-recyclerview,android-adapter,Java,Android,Android Recyclerview,Android Adapter,请不要将其标记为重复,因为昨天提供的解决方案不起作用 我已经填充了一个recyclerview,虽然加载速度有点慢,但工作正常 但是,假设我添加一个新名称并更新recyclerview时,它会与NullPointerException崩溃 以下是类别和代码: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.l
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();
}
}
第218行是adapter.notifyDataSetChanged()代码>
我尝试在onPostExecute
中实例化recyclerview
,但它一直崩溃。我的代码的工作原理是,它实际加载数据并将其显示在recyclerview
中。当我再次调用populateList()
方法时,它不会重新显示或重新加载
这个bug一直在我的睡眠中困扰着我,所以任何帮助和解决方案对我来说都意义重大
编辑:我想我确切地知道错误在哪里-它在ADDUSERS
类中的POSTEXECUTE方法中
谢谢在调用
notifyDataSetChanged()
之前,只需检查适配器是否为空:
之所以会发生这种情况,是因为AsyncTask是异步执行的,当它完成时,适配器可能不再可用。您可以尝试的一个选项是,而不是使用
adapter.notifyDataSetChanged();
取代
recyclerView.getAdapter().notifyDataSetChanged();
这是假设无论出于何种原因,您的适配器
已设置为空,但未在上面的代码中清楚显示,而回收视图
仍然完好无损
p/s:我也没有看到您更新最新检索到的数据并将其插入适配器。您可能也想检查一下。您在线程类中处理的变量超出了主类的作用域,而线程类总是粗略的。假设AsyncTask应该为您同步操作,我总是很谨慎 尝试将列表和适配器传递给DisplayUsersList类,例如
DisplayUsersList displayUsersList = new DisplayUsersList(list, adapter);
displayUsersList.execute();
public void dataSetChangedCallback() {
adapter.notifyDataSetChanged();
}
在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;
}
...
并在DisplayUsersList中更改适配器。notifyDataSetChanged();到
是的,但是我想更新数据,所以它不应该是
null
,这可能无法解决问题,因为这基本上不会更新数据。问题是为什么适配器为空。是的。答案是没有帮助的,我不知道为什么它是空的populateList()
onCreateonPostExecute
我认为错误在AddUsers
classWhy isrecyclerView.setHasFixedSize(true)中的onPostExecute
方法中代码>用于?我以为当你说“添加名称”时是为了对齐回收器视图。。。是怎么做到的?它是在同一个片段/活动中,还是作为单独的片段/活动完成?这段信息可能是适配器变为null.Nope的重要原因。你能删除它并看看会发生什么吗?你确实做了一些事情,将适配器设置为null。我尝试将该方法移动到onStart()
,然后我尝试了你的解决方案-不走运,它仍然会崩溃。你能发布更多的解决方案或查看我的编辑并告诉我是否有效吗?
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;
}
...
public void dataSetChangedCallback() {
adapter.notifyDataSetChanged();
}
...
dataSetChangedCallback();
...