简体   繁体   English

将 simpleAdapter 与图像一起用于列表视图

[英]Using simpleAdapter with image for listview

I have a little problem with putting an image to a list view using simple adapter.我在使用简单的适配器将图像放入列表视图时遇到了一些问题。 I'm getting the image from my online server(AMAZON).我从我的在线服务器(亚马逊)获取图像。 After downloading the image based on the user id, i try to set them in my listview but nothing was display and no error is occured.根据用户 ID 下载图像后,我尝试在我的列表视图中设置它们,但没有显示任何内容,也没有发生错误。

Below is my code:下面是我的代码:

// looping through All applicants
                for (int i = 0; i < applicant.length(); i++) {
                    JSONObject c = applicant.getJSONObject(i);

                    // Storing each JSON item in variable
                    String uid = c.getString(TAG_UID);
                    String name = c.getString(TAG_NAME);
                    String overall = c.getString(TAG_OVERALL);
                    String apply_datetime = c.getString(TAG_APPLY_DATETIME);
                    String photo = c.getString(TAG_PHOTO);

                    // creating new HashMap
                    //HashMap<String, String> map = new HashMap<String, String>();

                    //IMAGE
                    HashMap<String, Object> map = new HashMap<String, Object>();

                    // adding each child node to HashMap key (value)
                    map.put(TAG_UID, uid);
                    map.put(TAG_NAME, name);
                    map.put(TAG_OVERALL, overall);
                    map.put(TAG_APPLY_DATETIME, apply_datetime);

                    // adding HashList to ArrayList
                    // applicantsList.add(map);

                    // LISTING IMAGE TO LISTVIEW
                    try {
                        imageURL = c.getString(TAG_PHOTO);

                        InputStream is = (InputStream) new URL(
                                "my url link/images/"
                                        + imageURL).getContent();
                        d = Drawable.createFromStream(is, "src name");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    map.put(TAG_PHOTO, d);

                    // adding HashList to ArrayList
                    applicantsList.add(map);
                }

As you can see, after i download the image.如您所见,在我下载图像后。 i set to listview using simpleAdapter below:我使用下面的 simpleAdapter 设置为列表视图:

 SimpleAdapter adapter = new SimpleAdapter(
                            SignUpApplicantActivity.this, applicantsList,
                            R.layout.list_applicant, new String[] {
                                    TAG_UID, TAG_NAME, TAG_OVERALL,
                                    TAG_APPLY_DATETIME, TAG_PHOTO }, new int[] {
                                    R.id.applicantUid, R.id.applicantName,
                                    R.id.applicantOverall,
                                    R.id.apply_datetime, R.id.list_image });
                    // updating listView
                    setListAdapter(adapter);

Did you called notifyDatasetChange() ?您是否调用了 notifyDatasetChange() ? your adapter may not be invalidated if you don't call it.如果您不调用它,您的适配器可能不会失效。

From the SimpleAdapter documentation the image data is expected to be a resource ID or a string (an image URI) - see setViewImage(ImageView,String)SimpleAdapter 文档中,图像数据应为资源 ID 或字符串(图像 URI) - 请参阅setViewImage(ImageView,String)

I see 2 solutions:我看到 2 个解决方案:

  1. Provide a URI in the data map, not a drawable.在数据映射中提供 URI,而不是可绘制对象。
  2. Implement your own view binder to bind the drawable to the ImageView:实现您自己的视图绑定器以将 drawable 绑定到 ImageView:

     adapter.setViewBinder(new SimpleAdapter.ViewBinder() { @Override public boolean setViewValue(View view, Object data, String textRepresentation) { if(view.getId() == R.id.list_image) { ImageView imageView = (ImageView) view; Drawable drawable = (Drawable) data; imageView.setImageDrawable(drawable); return true; } return false; } });

Try尝试

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

                // Storing each JSON item in variable
                String uid = c.getString(TAG_UID);
                String name = c.getString(TAG_NAME);
                String overall = c.getString(TAG_OVERALL);
                String apply_datetime = c.getString(TAG_APPLY_DATETIME);
                String photo = c.getString(TAG_PHOTO);

                // creating new HashMap
                HashMap<String, String> map = new HashMap<String, String>();

                // adding each child node to HashMap key (value)
                map.put(TAG_UID, uid);
                map.put(TAG_NAME, name);
                map.put(TAG_OVERALL, overall);
                map.put(TAG_APPLY_DATETIME, apply_datetime);
                map.put(TAG_PHOTO, photo);

                // adding HashList to ArrayList
                applicantsList.add(map);
           } catch (Exception e) {
                    e.printStackTrace();
                }
          return null;
      }
           SimpleAdapter adapter = new SimpleAdapter(
                        SignUpApplicantActivity.this, applicantsList,
                        R.layout.list_applicant, new String[] {
                                TAG_UID, TAG_NAME, TAG_OVERALL,
                                TAG_APPLY_DATETIME, TAG_PHOTO }, new int[] {
                                R.id.applicantUid, R.id.applicantName,
                                R.id.applicantOverall,
                                R.id.apply_datetime, R.id.list_image });
                // updating listView
                setListAdapter(adapter);



Maybe my code can help you!?!也许我的代码可以帮助你!?! I have made我已经做了

convertDrawable(int Integer) convertDrawable(int 整数)

and String.valueOf(convertDrawable(iconId))和 String.valueOf(convertDrawable(iconId))

 HashF.put(TAG_ID, String.valueOf(convertDrawable(iconId)));


private void getList(JSONObject json) {
        try {
            details = json.getJSONArray(TAG_LIST);

            for (int i = 0; i < details.length(); i++) {

                JSONObject main = details.getJSONObject(i);
                Integer date = main.getInt(TAG_DATE);
                JSONArray nArray = main.getJSONArray(TAG_NOW);

                JSONObject detail = nArray.getJSONObject(0);
                Integer iconId = detail.getInt(TAG_ID);

                HashMap<String, String> HashF = new HashMap<String, String>();

                HashF.put(TAG_DATE, convertDate(date));
                HashF.put(TAG_ID, String.valueOf(convertDrawable(iconId)));

                fList.add(HashF);
            }
        } catch (Exception e) {

        }
        ListAdapter adapter = 
                new SimpleAdapter(getActivity(), 
                        fList, R.layout.list_item,
                new String[]{
                        TAG_DATE,
                        TAG_ID
                },
                new int[]{
                        R.id.datum,
                        R.id.icon_fore
                });

        setListAdapter(adapter);
    }

    public static String convertDate(Integer Time) {
        SimpleDateFormat sdf = 
                new SimpleDateFormat(
                        "dd, MMMM", Locale.getDefault());

        Calendar kal = 
                Calendar.getInstance();

        kal.setTimeInMillis(Time * 1000L);
        sdf.setTimeZone(kal.getTimeZone());
        return sdf.format(kal.getTime());

    }


    public static int convertDrawable(int aId){
        int icon = 0;

        if(aId == 8300){
            icon = R.drawable.draw1;
        }
        if (aId >= 7010 && actualId < 7919){
            icon = R.drawable.draw2;
        }
        if (aId >= 2010 && actualId <3010) {
            icon = R.drawable.draw3;
        }
        if (aId >= 3010 && actualId < 4010) {
            icon = R.drawable.draw4;
        }
        if (aId >= 6010 && actualId < 7010) {
            icon = R.drawable.draw5;
        }
        if (aId >= 5010 && actualId < 6010) {
            icon = R.drawable.draw6;
        }
        if (aId == 3801){
            icon = R.drawable.draw7;
        }
        if (aId == 8032){
            icon = R.drawable.draw8;
        }
        if (aId == 8083){
            icon = R.drawable.draw9;
        }
        if (aId == 8704) {
            icon = R.drawable.draw10;
        }

        return icon;
    }


Anyway make a look at Bitmap is not a Drawable无论如何看看Bitmap is not a Drawable

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM