1

最初我從服務器獲取數據列表並將其設置爲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(); 
     } 
    } 
} 
+2

發佈您的代碼。 – Blackbelt

+0

如果您正在下載圖片並顯示,我建議您使用UIL。如果您不喜歡使用第三方庫,請以任何方式發佈代碼 – Raghunandan

+0

嘗試從您的asynctask的onProgressUpdate()方法中更新您的UI。 – Jarvis

回答

0

你的代碼看起來正確的..但我覺得可能是什麼問題是mainActivity.getAdapter()我想你應該申報適配器全球喜歡。

專用AdapterYourCustomAdapter適配器;

,然後在的onCreate()

adapter = new AdapterYourCustomAdapter(context,arraylist(whatever constructor is)); 

,然後通調用它喜歡:

if (bitmap != null) { 
     imageView.setImageBitmap(bitmap); 
    } else { 
     imageView.setImageResource(R.drawable.ic_launcher); 
     if (!isScrolling && !mCurrentTasks.contains(imageKey) 
       && mainActivity.internetIsAvailable()) { 
      new BitmapLoaderTask(imageKey, adapter).execute(); 
     } 
    } 
+0

我已經通過在全球範圍聲明但沒有改進嘗試過它。 – dev1993

+0

您需要更改適配器的數據源以使其通知..我的意思是在這裏if(param!= null){ mListAdapter.notifyDataSetChanged(); }你沒有添加或刪除你的適配器的任何想法? – NaserShaikh

+0

是的。我沒有添加或從我的適配器中刪除。 – dev1993

0

嘗試使ImageView對於每個位圖入BitmapLoaderTask在施工並緊緊抓住該ImageView作爲裏面是一個成員變量。當您完成加載位圖時,使用onPostExecute方法將該位圖分配爲ImageView可繪製。

private class BitmapLoaderTask extends AsyncTask<Void, Void, Bitmap> { 

    private String mImageKey; 
    private ImageView mImageView; 

    public BitmapLoaderTask(ImageView imageView, String imageKey) { 
    mImageView = imageView; 
    mImageKey = imageKey; 
    } 

    protected void onPreExecute() { 

    /* Pre execute stuff */ 

    } 

    protected Bitmap doInBackground(Void... params) { 

    /* Your bitmap processing */ 

    return bitmap; 
    } 

    protected void onPostExecute(Bitmap param) { 
    if(param != null) { 
     mImageView.setImageBitmap(param); 
    } 
    } 
} 

這是AsyncTask構建的一個完美例子。 doInBackground()方法在後臺線程上運行,因此不會干擾UI處理,但android權限指示不允許此類後臺線程觸摸UI元素。這就是onProgressUpdate()onPostExecute()的作用,只要doInBackground達到了更新值的里程碑,它們就會在主UI線程上快速執行UI更新。在這種情況下,您正在使用它們在相應的位圖準備就緒時通知ImageView對象。