2012-11-26 50 views
1

我想在Gridview中显示来自互联网的图像。当我运行我的程序没有在错误目录下载,但没有图像显示在我的屏幕..来自互联网的Gridview图像

ImageAdapter.java:

public class ImageAdapter extends BaseAdapter { 
private Context mContext; 
Bitmap bmImg; 
ImageView imageView; 

public String[] mThumbIds = { 
     "http://i724.photobucket.com/albums/ww246/bnhenson/squishy.jpg", "http://cdn4.teen.com/wp-content/uploads/2012/07/paranorman-zayn-malik-tweets.jpg", 
     "http://xc0.xanga.com/08fe2b7a30c37281496919/m224298958.jpg" 
}; 

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

@Override 
public int getCount() { 
    return mThumbIds.length; 
} 

@Override 
public Object getItem(int position) { 
    return mThumbIds[position]; 
} 

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

@Override 
public View getView(int position, View convertView, ViewGroup parent) {   
    imageView = new ImageView(mContext); 
    downloadFile(mThumbIds[position]); 
    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
    imageView.setLayoutParams(new GridView.LayoutParams(135, 135)); 
    imageView.setPadding(0, 0, 1, 0); 
    return imageView; 
} 
void downloadFile(String fileUrl) { 

    AsyncTask<String, Object, String> task = new AsyncTask<String, Object, String>() { 

     @Override 
     protected String doInBackground(String... params) { 
      URL myFileUrl = null; 
      try { 
       myFileUrl = new URL(params[0]); 
      } 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 null; 
     } 
     protected void onPostExecute(String unused) { 
      imageView.setImageBitmap(bmImg); 
     } 
    }; 
    task.execute(fileUrl); 

}} 

AndroidGridLayoutActivity.java

public class AndroidGridLayoutActivity extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.grid_layout); 

    GridView gridView = (GridView) findViewById(R.id.grid_view); 

    // Instance of ImageAdapter Class 
    gridView.setAdapter(new ImageAdapter(this)); 
}} 

grid_layout。 xml

<?xml version="1.0" encoding="utf-8"?> 
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/grid_view" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:numColumns="auto_fit" 
android:columnWidth="90dp" 
android:horizontalSpacing="10dp" 
android:verticalSpacing="10dp" 
android:gravity="center" 
android:stretchMode="columnWidth" > 

</GridView> 

而在我的清单中,我添加了这两行:

<uses-permission android:name="android.permission.INTERNET"></uses-permission> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

有没有人有想法,我在这里错过了什么?

在此先感谢您的帮助,

Germain。

+0

你根本没有看到任何东西,或者只是图像没有出现在GridView的单元格中? – Luksprog

+0

是的图像没有出现在单元格中,我的“页面”是白色的,没有任何内容,没有任何崩溃或停止。 – GermainGum

+0

您确定'doInBackground'中的代码不会引发异常结果位图为'null'? – Luksprog

回答

1

您应该为网格的每个单元格创建一个单独的ImageView对象,而不是使用全局变量。要做到这一点,这样类似的东西:

public View getView(int position, View convertView, ViewGroup parent) { 
    ImageView imageView = new ImageView(mContext); 
    downloadFile(imageView, mThumbIds[position]); 
    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
    imageView.setLayoutParams(new GridView.LayoutParams(135, 135)); 
    imageView.setPadding(0, 0, 1, 0); 
    return imageView; 
} 

void downloadFile(ImageView imageView, String fileUrl) { 
    // ... 
    // change your AsyncTask so you can pass imageView as well 
    // instead of setting loaded bitmap to global mImageView, set it to the passed in imageView. 
    // ... 
} 

要更改您的AsyncTask,可以更改为paramsObject的类型,所以你可以通过imageViewfileUrldoInBackground()或创建一个类为您AyncTask与构造,你可以传递两个对象并将它们存储在AsyncTask本地的变量中,以便您可以从doInBackground()方法访问它们。

另请注意,如果网格中包含更多项目,则当它具有非空值时,应重新使用在convertView中传递的值。

+0

您能否详细说明这一点:“另外请注意,如果网格中有更多项目,当它具有非空值时应该重用传入的convertView。“?我不明白这部分 – GermainGum

+0

这是一个列表和网格视图非常常见的用例。假设您有一个包含1000个条目的列表,并且只有10个可以同时显示(由于屏幕大小)。 Android首先要做的只是向列表视图的适配器请求前10个项目,而不是全部1000个。现在,当你向下滚动时,第11行将在第11行进入视图时滚动出视图。现在,您的getView()方法获得了以'convertView'形式传递的现在不可见的行的视图,并且您应该使用该视图并将其调整为代表第11行,而不是创建新视图。 – Ridcully

+0

...这样,只需要10个视图对象来显示1000个条目列表,避免在视图之后创建和删除视图,这在android中非常常见。对此有很多更好的解释,如果你想有效地编程列表和GridView,你应该真正掌握它。 – Ridcully

相关问题