使用SimpleAdapter将获取的图像加载到listView中

时间:2014-04-11 20:27:59

标签: java android hashmap simpleadapter

我遇到了这个问题。我从web url(虽然它是localHost)和其他东西中获取了图像。 然而,其他东西出现了,但图像不是。 我无法弄清楚出了什么问题。 我发布了我班级的代码。看看这个。 这是代码:

public void updateJSONData() {

    int success;
    Bitmap photo = null;

    Intent in = getIntent();
    Bundle extras = in.getExtras();
    String city = extras.getString("CITY");
    Log.d(TAG, "City received: " + city);

    try {

        JSONParser jParser = new JSONParser();
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("CITY", city));

        JSONObject json = jParser.makeHttpRequest(FETCH_HOSTEL_URL, "POST",
                params);
        Log.d("Json response", json.toString());

        success = json.getInt(TAG_SUCCESS);
        if (success == 1) {

            mHostels = json.getJSONArray(TAG_HOSTELS);
            mHostelList = new ArrayList<HashMap<String, Object>>();

            for (int i = 0; i < mHostels.length(); i++) {
                JSONObject c = mHostels.getJSONObject(i);

                Drawable d = null;
                String hos_name = c.getString(TAG_NAME);
                String hos_rent = c.getString(TAG_RENT);
                // String hos_img = c.getString(TAG_IMG);
                String hos_imgURL = "http://192.168.2.10:80/homey_uploads/avtars/IMG_-137606592.jpg";

                try {

                    getBitmapFromUrl(hos_imgURL);
                    photo = bmp;
                    cityCap.setImageBitmap(photo);

                } catch (Exception ex) {
                    Log.d(TAG, "Bitmap Not Received");
                }

                HashMap<String, Object> map = new HashMap<String, Object>();
                map.put(TAG_NAME, hos_name);
                map.put(TAG_RENT, hos_rent);
                map.put(TAG_IMG, photo);

                mHostelList.add(map);
                Log.d(TAG, "Map Addedd!!" + mHostelList.toString());
            }
        } else if (success == 0) {
            Log.d(TAG, "Fetch Failure!!");
            done = false;
            msg = json.getString(TAG_MESSAGE);
        }

    } catch (Exception e) {
        Log.d(TAG, "Exception occured:" + e.toString());
        done = false;
    }
}

private static Bitmap getBitmapFromUrl(String hos_imgURL) throws IOException {

    URL IMGURL = new URL(hos_imgURL);
    Log.d(TAG, "Image Url:" + IMGURL.toString());
    HttpURLConnection conn = (HttpURLConnection) IMGURL.openConnection();
    conn.setDoInput(true);
    conn.connect();

    conn.setConnectTimeout(30000);
    conn.setReadTimeout(30000);

    InputStream is = conn.getInputStream();
    bmp = BitmapFactory.decodeStream(is);

    return bmp;
}

public void updateList() {

    // LazyAdapter adapter = new LazyAdapter(SearchResult.this,
    // mHostelList);

    ListAdapter adapter = new SimpleAdapter(SearchResult.this, mHostelList,
            R.layout.single_hostel, new String[] { TAG_NAME, TAG_RENT,
                    TAG_IMG }, new int[] { R.id.tv_h_name, R.id.tv_h_rent,
                    R.id.iv_h_frontPic });

    SimpleAdapter.ViewBinder viewBinder = new SimpleAdapter.ViewBinder() {

        @Override
        public boolean setViewValue(View view, Object data,
                String textRepresentation) {
            if (view.getId() == R.id.tv_h_name) {
                ((TextView) view).setText((String) data);
                return true;
            } else if (view.getId() == R.id.tv_h_rent) {
                ((TextView) view).setText((String) data);
            } else if (view.getId() == R.id.iv_h_frontPic) {
                ((ImageView) view).setImageBitmap((Bitmap) data);
            }
            return false;
        }
    };
    ((SimpleAdapter) adapter).setViewBinder(viewBinder);

    setListAdapter(adapter);

    ListView lv = getListView();
    lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            Intent intent = new Intent(SearchResult.this,
                    HDetailTabActivity.class);
            startActivity(intent);
        }
    });

}

public class LoadHostels extends AsyncTask<Void, Void, Boolean> {

    @Override
    protected void onPreExecute() {

        super.onPreExecute();
        pDialog = new ProgressDialog(SearchResult.this);
        pDialog.setMessage("Loading Hostels");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    @Override
    protected Boolean doInBackground(Void... arg0) {

        updateJSONData();
        return null;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        super.onPostExecute(result);

        pDialog.dismiss();
        if (done != true) {
            Toast.makeText(SearchResult.this, "Error:" + msg,
                    Toast.LENGTH_LONG).show();
        } else if (done = true) {
            updateList();
        }
    }

}

Logcat说无法解码流,但是当我将图像设置为另一个图像时,它显示出来了。 附加Logcat:

04-12 14:38:34.857: D/TRACKING...(8616): Map Addedd!![{h_img=android.graphics.Bitmap@4149d108, h_name=M R Hostel, h_d_mrent=4500}, {h_img=android.graphics.Bitmap@41600b78, h_name=Hostel Of Achievers, h_d_mrent=3500}, {h_img=android.graphics.Bitmap@414edd18, h_name=Hostel Of Care, h_d_mrent=2500}]
04-12 14:38:34.860: D/OpenGLRenderer(8616): Flushing caches (mode 0)
04-12 14:38:34.898: E/BitmapFactory(8616): Unable to decode stream: java.io.FileNotFoundException: /android.graphics.Bitmap@4149d108: open failed: ENOENT (No such file or directory)
04-12 14:38:34.898: I/System.out(8616): resolveUri failed on bad bitmap uri: android.graphics.Bitmap@4149d108
04-12 14:38:34.914: E/BitmapFactory(8616): Unable to decode stream: java.io.FileNotFoundException: /android.graphics.Bitmap@41600b78: open failed: ENOENT (No such file or directory)
04-12 14:38:34.914: I/System.out(8616): resolveUri failed on bad bitmap uri: android.graphics.Bitmap@41600b78
04-12 14:38:34.929: E/BitmapFactory(8616): Unable to decode stream: java.io.FileNotFoundException: /android.graphics.Bitmap@414edd18: open failed: ENOENT (No such file or directory)
04-12 14:38:34.929: I/System.out(8616): resolveUri failed on bad bitmap uri: android.graphics.Bitmap@414edd18

请帮助!!!

1 个答案:

答案 0 :(得分:3)

SimpleAdapter不支持将Bitmap设置为开箱即用的ImageView - 仅限资源ID或字符串网址。

因此,您需要扩展SimpleAdapter.ViewBinder以提供自己的绑定逻辑:

SimpleAdapter.ViewBinder viewBinder = new SimpleAdapter.ViewBinder() {
    @Override
    public boolean setViewValue(View view, Object data, String textRep) {
        if (view.getId() == R.id.tv_h_name) {
            ((TextView)view).setText((String)data);
            return true;
        } else if (view.getId() == R.id.tv_h_rent) {
            // same here
        } else if (view.getId() == R.id.iv_h_frontPic) {
            ((ImageView)view).setImageBitmap((Bitmap)data);
            return true;
        }
        return false;
    }
}
((SimpleAdapter)adapter).setViewBinder(viewBinder);