2011-05-13 40 views
0

任何人都可以看到我在這裏做錯了嗎?我知道這是很多代碼,但除此之外,圖像不會在圖像視圖中出現,所以我沒有發現任何錯誤。圖像瀏覽出現,但是空的。將外部圖像加載到gridview(無圖像)

我想我在錯誤的地方或什麼東西運行asynctask?

下面的代碼:

MainActivity.java:

package se.bjornange.android.grid; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.GridView; 

public class mainActivity extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    GridView gridview = (GridView) findViewById(R.id.gridview);  
    gridview.setAdapter(new ImageAdapter(this)); 
} 

} 

ImageAdapter.java

package se.bjornange.android.grid; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.GridView; 
import android.widget.ImageView; 

public class ImageAdapter extends BaseAdapter implements NetworkCallListener { 
private Context mContext; 
Bitmap thebmp; 
ImageView imageView; 

public ImageAdapter(Context c) { 
    mContext = c; 
} 

public int getCount() { 
    return aThumbUrls.length; 
} 

public Object getItem(int position) { 
    return null; 
} 

public long getItemId(int position) { 
    return 0; 
} 

public void onNetworkCallComplete(Bitmap bmp) { 

    thebmp = bmp; 

} 

// create a new ImageView for each item referenced by the Adapter 
public View getView(int position, View convertView, ViewGroup parent) { 


    new NetworkCallTask(this).execute(aThumbUrls[position]); 

    if (convertView == null) { 
     // if it's not recycled, initialize some attributes 
     imageView = new ImageView(mContext); 
     imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
     imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     imageView.setPadding(8, 8, 8, 8); 

    } else { 

     imageView = (ImageView) convertView; 
    } 

    imageView.setImageBitmap(thebmp); 

    return imageView; 
} 

private String[] aThumbUrls = { "http://www.google.se/images/logo_sm.gif", 
     "http://www.google.se/images/logo_sm.gif", "http://www.google.se/images/logo_sm.gif" 
      }; 

@Override 
public void onNetworkCallCancel() { 
    // TODO Auto-generated method stub 

} 

} 

NetworkCallListener.java

package se.bjornange.android.grid; 

import android.graphics.Bitmap; 

public interface NetworkCallListener { 
    public void onNetworkCallComplete(Bitmap bmp); 

    public void onNetworkCallCancel(); 

} 

NetworkCallTask​​.java

package se.bjornange.android.grid; 


import java.io.IOException; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 

public class NetworkCallTask extends AsyncTask<String, Void, Bitmap> { 
NetworkCallListener listener = null; 
String url; 
    public NetworkCallTask(NetworkCallListener listener) { 
    this.listener = listener; 
    } 


protected void onPreExecute() { 

} 

protected Bitmap doInBackground(String... params) { 

    Bitmap bmImg = null; 
    url = params[0]; 
    URL myFileUrl = null; 


    try { 
     myFileUrl = new URL(url); 
    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    try { 
     HttpURLConnection conn = (HttpURLConnection) myFileUrl 
       .openConnection(); 
     conn.setDoInput(true); 
     conn.connect(); 
     InputStream is = conn.getInputStream(); 

     bmImg = BitmapFactory.decodeStream(is); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return bmImg; 
} 

protected void onPostExecute(final Bitmap bmImg) { 
    //imageView.setImageBitmap(bmImg); 

    listener.onNetworkCallComplete(bmImg); 
} 

} 

回答

1

冷藏下面鏈接

Lazy load of images in ListView

源可以在這裏找到http://open-pim.com/tmp/LazyList.zip

+0

非常感謝。我會看看它,並嘗試將其更改爲使用gridview。 – 2011-05-13 11:41:10

+0

@ TMA-1你試過這段代碼嗎? – Nikhil 2011-05-16 10:26:25

+0

是的,我現在正在努力在我的應用中實現它。這似乎是我正在尋找,但我有一些空指針異常來解決=)我是一個Android和Java新手,所以有時我會陷入最基本的東西。 =) – 2011-05-17 06:53:28

0

我不認爲你可以分配位圖後,你用imageView.setImageBitmap(thebmp)設置它;您應該在onNetworkCallComplete()函數中執行imageView.setImageBitmap();

試試這個:

@Override 
    public View getView(final int position, final View convertView, final ViewGroup parent) { 
     final ImageView imageV = convertView == null ? new ImageView(this) : (ImageView) convertView; 
     new AsyncTask(){ 
     Bitmap bitmap; 
     @Override 
     protected Object doInBackground(Object... params) { 
      bitmap = load your bitmap here 
      return null; 
     } 
     @Override 
     protected void onPostExecute(Object result) { 
      imageV.setImageBitmap(bitmap); 
     } 
     }.execute(null); 
     return imageV; 
    } 
+0

我認爲這是問題的很多,但它並沒有區別。 如果感覺加載的位圖沒有通過imageview到達某處。 – 2011-05-13 11:21:30

+0

嘗試刪除頂層的ImageView聲明,而是每次在getView()中創建一個新的ImageView,除非當然convertView!= null,然後將創建或回收的ImageView傳遞給您的NetworkCallTask​​並在onPostExecute內執行imageView.setImageBitmap() () – 2011-05-13 11:26:32

+0

我試圖做一些像你之前建議的事情,但我無法找到如何從NetworkCallTask​​獲取可訪問的imageView。對此有何建議? – 2011-05-13 11:35:33