【问题标题】:image display as gridview图像显示为gridview
【发布时间】:2012-06-04 05:09:37
【问题描述】:

我想使用 imageurl 显示来自 mysql 服务器(在 localhost 中测试)的图像,我在我的服务器上的一个 filder 中有图像,在一个 android 客户端应用程序中作为 gridview 以及 text。如何在我的代码中使用 imageurl? 我的主菜单.java

public class MainMenu extends Activity {



    GridView gridView;

    static final String[] MOBILE_OS = new String[] { 
        "Android", "iOS","Windows", "Blackberry" };

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.mainmenu_list);


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

        gridView.setAdapter(new ImageAdapter(this, MOBILE_OS));

        gridView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v,
                    int position, long id) {
                Toast.makeText(
                   getApplicationContext(),
                   ((TextView) v.findViewById(R.id.grid_item_label))
                   .getText(), Toast.LENGTH_SHORT).show();

            }
        });

    }

}

我的 imageadapter.java:

public class ImageAdapter extends BaseAdapter {
private Context context;
private final String[] mobileValues;
    public ImageAdapter(Context context, String[] mobileValues) {
    this.context = context;
    this.mobileValues = mobileValues;
}

public View getView(int position, View convertView, ViewGroup parent) {

    LayoutInflater inflater = (LayoutInflater) context
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View gridView;

    if (convertView == null) {

        gridView = new View(context);

        // get layout from list.xml
        gridView = inflater.inflate(R.layout.list, null);

        // set value into textview
        TextView textView = (TextView) gridView
                .findViewById(R.id.grid_item_label);
        textView.setText(mobileValues[position]);

        // set image based on selected text
        ImageView imageView = (ImageView) gridView
                .findViewById(R.id.grid_item_image);

        String mobile = mobileValues[position];

        if (mobile.equals("Windows")) {
            imageView.setImageResource(R.drawable.imggrid);
        } else if (mobile.equals("iOS")) {
            imageView.setImageResource(R.drawable.imggrid);
        } else if (mobile.equals("Blackberry")) {
            imageView.setImageResource(R.drawable.imggrid);
        } else {
            imageView.setImageResource(R.drawable.imggrid);
        }

    } else {
        gridView = (View) convertView;
    }

    return gridView;
}

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

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

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

}

我不知道如何在我的代码中使用以下内容:

try {
            URL url = new URL(imageFileURL);
            URLConnection conn = url.openConnection();                   
            HttpURLConnection httpConn = (HttpURLConnection)conn;
            httpConn.setRequestMethod("GET");
            httpConn.connect();               
            if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
             InputStream inputStream = httpConn.getInputStream();                     
             Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
             inputStream.close();
             img.setImageBitmap(bitmap);
            }
           } catch (MalformedURLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
           } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
           }

【问题讨论】:

  • 提前谢谢..有人请帮忙
  • 确切的问题是什么?你有任何错误吗?如果是,请发布 logcat。
  • 这段代码对定义数量的图像和文本正常工作。但我需要显示从服务器检索到的所有图像,作为gridview。

标签: android image url gridview


【解决方案1】:

将图片下载代码放入AsyncTaskHere is the explanation。 在您的 getView 方法中执行一个 asynctask 实例,即每次获取一张图像。

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
 ImageView mImageView;
 public void setImageView(ImageView img) {
      mImageView = img;
 }

 protected Bitmap doInBackground(String... urls) {
     return loadImageFromNetwork(urls[0]);
 }

 protected void onPostExecute(Bitmap result) {
     mImageView.setImageBitmap(result);
 }

}

在执行你的AsyncTask之前调用task.setImageView(yourImageViewinGrid),让它知道下载后在哪里设置图像。

【讨论】:

  • 谢谢@userSeven7s,但我目前有近10张图片,在服务器更新时数量可能会增加。那么你能告诉我如何检索放在服务器上特定文件夹中的所有图片可以同时下载并显示在我的客户端应用程序上吗?我需要在每张图片中加入一些文本作为项目名称。点击后应该会打开另一个活动。再次感谢
【解决方案2】:

要获取图像,您必须执行以下操作:

URL new_url = new URL("your url"); 
Bitmap image_bitmap = BitmapFactory.decodeStream(newurl.openConnection() .getInputStream()); ImageView image_view = new ImageView(this);
image_view.setImageBitmap(image_bitmap);

无论如何,最好将图像下载为后台任务。我实际上做的是创建一个自定义视图,其中包含一个扩展 AsyncTask 的私有内部类来为您下载图像。

【讨论】:

  • 谢谢@Warut Surapat..你能告诉我如何在我的 gridview 中显示那些检索到的图像吗?请为我编辑代码
【解决方案3】:

我不知道如何在我的代码中使用以下内容:

该代码将为您下载图像,您可以将AsyncTaskThread 放在单独的线程中,并将下载的图像设置在图像视图中......就这么简单。网上有很多例子,你可以google一下

EIDTED

图片下载代码

public class AsyncFetchImage extends AsyncTask<String, Void, Bitmap>{

    private WeakReference<ImageView> imageReference;
//  private WeakReference<Dialog> dialogReferance;

    public AsyncFetchImage(ImageView imageview) {
        imageReference = new WeakReference<ImageView>(imageview);
//      dialogReferance = new WeakReference<Dialog>(dialog);
    }

    @Override
    protected Bitmap doInBackground(String... s) {

        return downloadImage(s[0]);
    }

    private Bitmap downloadImage(String url) {

        final AndroidHttpClient client = AndroidHttpClient.newInstance("Nixit");
        final HttpGet getRequest = new HttpGet(url);
        try {

            HttpResponse response = client.execute(getRequest);
            final int statusCode = response.getStatusLine().getStatusCode();

            if(statusCode != HttpStatus.SC_OK){
                Log.w("ImageDownloader", "Error " + statusCode + " while retrieving bitmap from " + url); 
                return null;
            }
            final HttpEntity entity = response.getEntity();
            if(entity != null){
                InputStream is = null;
                try{
                    is = entity.getContent();
                    final Bitmap bit = BitmapFactory.decodeStream(is);
                    return bit;
                }finally{
                    if(is != null)
                        is.close();
                    entity.consumeContent();
                }
            }


        } catch (IOException e) {
            e.printStackTrace();
            return null;
        } finally{
            if(client != null){
                client.close();
            }
        }
        Log.i("Image Fetch","Image Fetch Complete");
        return null;
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        if(isCancelled()){
            result = null;
        }
        if(imageReference != null){
            ImageView imageView = imageReference.get();
//          Dialog di = dialogReferance.get();
            if (imageView != null) {
                imageView.setImageBitmap(result);
//                di.show();
            }

        }
    }


}

使用方法:-

imageView = (ImageView)dialog.findViewById(R.id.imageView1);

AsyncFetchImage fetchImage = new AsyncFetchImage(imageView);
fetchImage.execute(url);

你可以在适配器的getview方法中使用这个

希望有所帮助

【讨论】:

  • 谢谢@Nixit Patel ..我尝试了几个例子,但没有一个对我有用..你能告诉我如何将该 url 代码部分合并到我的 mainmenu 和 imageadapter 类中吗?那会更有帮助
  • thanx @Nixit Patel ..但我无法配置我的 imageadapter 类。如果你不介意,请准确告诉我如何修改我的 mainmenu 类..你可以编辑 mainmenu 类清楚的理解..
  • @ess.crazy 在适配器类中,您有方法 getView(...) 并在 getView 方法中添加我更新中的代码“如何使用”,
  • 仍然出现错误@Nixit..请根据您的想法复制粘贴代码 imageadapter 类代码
  • 将代码放入 imageadapter 时出现某种错误,我无法设置类..所以请告诉我如何修改该 imageadapter 类。应该更改 layoutinflater 和所有内容吗?请编辑以您认为正确的方式为我提供的图像适配器代码
猜你喜欢
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 2014-08-09
相关资源
最近更新 更多