最初我從服務器獲取數據列表並將其設置爲listview。notifyDataSetChanged不刷新列表視圖
當向下滾動列表視圖時,我從服務器獲取數據的集合並調用我的自定義適配器的notifydatasetchanged。
在自定義適配器的getView()方法中,我通過asyntask從服務器下載圖像。下載成功並在本地存儲。然後試圖刷新ascombask的onPostExecute列表視圖。但它沒有得到更新。
onPostExecute的日誌正在打印,但listview沒有得到刷新。
公共無效loadBitmap(MainActivity mainActivity,字符串imageKey,ImageView的ImageView的,布爾isScrolling) { 最終位圖的位圖= getBitmapFromCache(imageKey);
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
} else {
imageView.setImageResource(R.drawable.ic_launcher);
if (!isScrolling && !mCurrentTasks.contains(imageKey)
&& mainActivity.internetIsAvailable()) {
BitmapLoaderTask task = new BitmapLoaderTask(imageKey,
mainActivity.getAdapter());
task.execute();
}
}
}
private class BitmapLoaderTask extends AsyncTask<Void, Void, Bitmap> {
private ListAdapter mListAdapter;
private String mImageKey;
public BitmapLoaderTask(String imageKey, ListAdapter adapter) {
mListAdapter = adapter;
mImageKey = imageKey;
}
@Override
protected void onPreExecute() {
mCurrentTasks.add(mImageKey);
}
@Override
protected Bitmap doInBackground(Void... params) {
Bitmap b = null;
try {
URL url = new URL(mImageKey);
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.connect();
b = BitmapFactory.decodeStream(connection.getInputStream());
if (b != null) {
int width = b.getWidth();
int height = b.getHeight();
if (width >= mMaxWidth || height >= mMaxHeight) {
while (true) {
if (width <= mMaxWidth || height <= mMaxHeight) {
break;
}
width /= 2;
height /= 2;
}
b = Bitmap.createScaledBitmap(b, width, height, false);
}
connection.disconnect();
addBitmapToCache(mImageKey, b);
return b;
}
return null;
} catch (IOException e) {
if (e != null) {
e.printStackTrace();
}
return null;
}
}
@Override
protected void onPostExecute(Bitmap param) {
mCurrentTasks.remove(mImageKey);
if (param != null) {
mListAdapter.notifyDataSetChanged();
}
}
}
發佈您的代碼。 – Blackbelt
如果您正在下載圖片並顯示,我建議您使用UIL。如果您不喜歡使用第三方庫,請以任何方式發佈代碼 – Raghunandan
嘗試從您的asynctask的onProgressUpdate()方法中更新您的UI。 – Jarvis