【问题标题】:Load fetched Images into listView Using SimpleAdapter使用 SimpleAdapter 将获取的图像加载到 listView
【发布时间】:2014-05-26 03:55:36
【问题描述】:

我被这个问题困住了。我从 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

请帮忙!!!

【问题讨论】:

    标签: java android hashmap simpleadapter


    【解决方案1】:

    SimpleAdapter 不支持将Bitmaps 设置为开箱即用的ImageViews -- 只能通过资源 id 或字符串 url。

    所以,您需要扩展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);
    

    【讨论】:

    • 先生,我编辑了我的代码。请看一下,让我知道问题出在哪里?我检查了网址是正确的。
    • 知道了,先生.. 非常感谢您
    • @Pp25793 提醒一下:如果我的回答对您有所帮助,请不要忘记将其标记为已接受——答案左侧的复选标记。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 2017-07-13
    • 2018-02-08
    • 1970-01-01
    相关资源
    最近更新 更多