我是Android新手,在Android中遇到过这个问题。基本上我想要一个列表视图并为它实现一个自定义列表适配器。对于该适配器,我需要使用列表初始化它,该列表包含从某个网站获取的数据。我决定使用AsyncTask。
我的原始代码如下:
public void onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
..........Other codes.........
initData();
mAdapter = new MainContentListAdapter(mList);
....................
}
public class FetchQTask extends AsyncTask<String, Void, ArrayList<MainContentListItem>> {
...... Some other codes ......
@Override
protected void onPostExecute(ArrayList<MainContentListItem> results) {
if(mList!=null) mList.clear();
else mList = new ArrayList<MainContentListItem>();
for(MainContentListItem result : results) {
mList.add(result);
}
progressDialog.cancel();
}
}
private void initData(){
FetchQTask qTask = new FetchQTask();
qTask.execute();
}
但是,当App启动时,mList中没有数据。具体来说,当我尝试使用调试模式时,程序显然会遇到&#34;添加元素&#34;部分但由于某种原因清楚它。我怀疑我的代码的逻辑是否不正确但无法找到原因。在一些盲目尝试之后,我决定在AsyncTask&#34;之外移动&#34;新的ArrayList部分,如你所见,目前我的代码如下:
public void onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
..........Other codes.........
mList = new ArrayList<>();
initData();
mAdapter = new MainContentListAdapter(mList);
....................
}
public class FetchQTask extends AsyncTask<String, Void, ArrayList<MainContentListItem>> {
...... Some other codes ......
@Override
protected void onPostExecute(ArrayList<MainContentListItem> results) {
if (results != null) {
mList.clear();
for(MainContentListItem result : results) {
mList.add(result);
}
}
progressDialog.cancel();
}
}
private void initData(){
FetchQTask qTask = new FetchQTask();
qTask.execute();
}
现在它有效!我想问的问题是为什么会这样?我甚至不知道发生了什么。是否与在另一个线程中分配内存有关?
对不起我的愚蠢,但非常感谢任何帮助。
非常感谢。
答案 0 :(得分:1)
这是因为在使用此数组实现适配器后,必须维护“mList”数组的相同实例。 在第一种情况下,清除mList并在onPostExecute方法中重新设置它,因此您在适配器中设置的Array实例与新实例不同:
public void onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
..........Other codes.........
--> mList = new ArrayList<MainContentListItem>();
initData();
mAdapter = new MainContentListAdapter(mList);
....................
}
public class FetchQTask extends AsyncTask<String, Void, ArrayList<MainContentListItem>> {
...... Some other codes ......
@Override
protected void onPostExecute(ArrayList<MainContentListItem> results) {
// Here your mList array is not null because already instanciate onCreateView method.
for(MainContentListItem result : results) {
mList.add(result);
}
progressDialog.cancel();
}
}