我有一个listview,可以从服务器加载数据。数据加载正确,但一段时间后滚动列表,应用程序崩溃,我收到消息“收到数据,但没有通知适配器!”以下是我的代码:
private class LoadData extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
applicationList = new ArrayList();
applicationList.clear();
try {
JSONArray jsonData = new GetListviewsData().getJSONData(webfileName, limit, offset, priceCat);
for (int i = 0; i <= jsonData.length() - 2; i++) {
JSONObject c = jsonData.getJSONObject(i);
id = c.getString("id");
name = c.getString("name");
logo = c.getString("logo");
developer = c.getString("developer");
category = c.getInt("category");
fileName = c.getString("filename");
path = c.getString("path");
appSize = c.getDouble("size_bytes");
price = c.getInt("price");
data = c.getString("data1").equals("t");
obb = c.getString("data").equals("t");
applicationList.add(new ApplicationPojo(id, name, logo, developer, appSize, category, fileName, path, data, obb, price));
}
JSONObject sizeObj = jsonData.getJSONObject(jsonData.length() - 1);
listSize = sizeObj.getInt("size");
} catch (Exception ex) {
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
if(listSize == 0){
TextView noResult = (TextView) findViewById(R.id.noresult);
noResult.setVisibility(View.VISIBLE);
mProgressDialog.dismiss();
}else{
adapter = new ListViewAppAdapter(ListViewAppAll.this, applicationList, listview);
listview.setAdapter(adapter);
mProgressDialog.dismiss();
listview.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
int threshold = 1;
int count = listview.getCount();
if (scrollState == SCROLL_STATE_IDLE) {
if (listview.getLastVisiblePosition() >= count - threshold) {
if (listSize >= offset) {
offset = offset + 15;
new LoadMoreData().execute();
} else {
Toast.makeText(getApplicationContext(), "End of list!", Toast.LENGTH_LONG).show();
listview.removeFooterView(footer);
}
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
}
});
}
}
}
private class LoadMoreData extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
try {
GetListviewsData getDataAppList = new GetListviewsData();
JSONArray jsonData = getDataAppList.getJSONData(webfileName, limit, offset, priceCat);
for (int i = 0; i <= jsonData.length(); i++) {
JSONObject c = jsonData.getJSONObject(i);
id = c.getString("id");
name = c.getString("name");
logo = c.getString("logo");
developer = c.getString("developer");
category = c.getInt("category");
fileName = c.getString("filename");
path = c.getString("path");
appSize = c.getDouble("size_bytes");
price = c.getInt("price");
data = c.getString("data1").equals("t");
obb = c.getString("data").equals("t");
applicationList.add(new ApplicationPojo(id, name, logo, developer, appSize, category, fileName, path, data, obb, price));
}
} catch (Exception ex) {
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
adapter.notifyDataSetChanged();
}
}
请帮我解决这个问题。感谢
答案 0 :(得分:1)
我对您的代码进行了一些更改。
变化,
applicationList
,而是使用addAll
一次添加所有内容,然后致电notifyDataSetChanged
。这应该删除错误。adapter
。AsyncTask
代替两个。AsyncTask
doInbackground
返回ArrayList
代替void
。请参阅下面的代码,
// start from 0
int offset = 0;
// create dataset
ArrayList<ApplicationPojo> applicationList = new ArrayList();
// create adapter
ListViewAppAdapter adapter;
onCreate(){
...
TextView noResult = (TextView) findViewById(R.id.noresult);
adapter = new ListViewAppAdapter(ListViewAppAll.this, applicationList, listview);
listview.setAdapter(adapter);
listview.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
int threshold = 1;
int count = listview.getCount();
if (scrollState == SCROLL_STATE_IDLE) {
if (listview.getLastVisiblePosition() >= count - threshold) {
if (listSize >= offset) {
offset = offset + 15;
new LoadData().execute();
} else {
Toast.makeText(getApplicationContext(), "End of list!", Toast.LENGTH_LONG).show();
listview.removeFooterView(footer);
}
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
});
}
private class LoadData extends AsyncTask<Void, Void, ArrayList<ApplicationPojo>> {
@Override
protected Void doInBackground(Void... voids) {
ArrayList<ApplicationPojo> temp = new ArrayList();
try {
JSONArray jsonData = new GetListviewsData().getJSONData(webfileName, limit, offset, priceCat);
for (int i = 0; i < jsonData.length() - 1; i++) {
JSONObject c = jsonData.getJSONObject(i);
id = c.getString("id");
name = c.getString("name");
logo = c.getString("logo");
developer = c.getString("developer");
category = c.getInt("category");
fileName = c.getString("filename");
path = c.getString("path");
appSize = c.getDouble("size_bytes");
price = c.getInt("price");
data = c.getString("data1").equals("t");
obb = c.getString("data").equals("t");
temp.add(new ApplicationPojo(id, name, logo, developer, appSize, category, fileName, path, data, obb, price));
}
JSONObject sizeObj = jsonData.getJSONObject(jsonData.length() - 1);
listSize = sizeObj.getInt("size");
} catch (Exception ex) {
ex.printStackTrace();
}
return temp;
}
@Override
protected void onPostExecute(ArrayList<ApplicationPojo> list) {
if(listSize == 0) {
noResult.setVisibility(View.VISIBLE);
} else {
applicationList.addAll(list);
applicationList.notifyDataSetChanged();
}
mProgressDialog.dismiss();
}
}