2011-05-13 61 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