我从JSON数组获取数据,我可以在textviews中显示文本,但显示图像时出现问题。

这是主要活动:

public class test extends ListActivity {

// url to make request
private static String url = "http://test/json.php";

// JSON Node names
private static final String CONTACTS = "contacts";
private static final String NAME = "name";
private static final String IMAGE = "image";

// contacts JSONArray
JSONArray contacts = null;

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

    // Hashmap for ListView
    ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();

    // Creating JSON Parser instance
    JSONParser jParser = new JSONParser();

    // getting JSON string from URL
    JSONObject json = jParser.getJSONFromUrl(url);

    try {
        // Getting Array of Contacts
        contacts = json.getJSONArray(CONTACTS);

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

            // Storing each json item in variable
            String name = c.getString(NAME);
            String image = c.getString(IMAGE);

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

            // adding each child node to HashMap key => value
            map.put(NAME, name);
            map.put(IMAGE, image);

            // adding HashList to ArrayList
            contactList.add(map);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }

    testAdapter adapter =  new testAdapter(
            test.this, contactList,
            R.layout.list_item, new String[] {},
            new int[] {});
    // updating listview
    setListAdapter(adapter);

}

这是我的适配器类:

public class testAdapter extends SimpleAdapter {

    private Context mContext;
    public ImageLoader imageLoader;
    public LayoutInflater inflater=null;
    public testAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) {
        super(context, data, resource, from, to);
        mContext = context;
        inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        imageLoader=new ImageLoader(mContext.getApplicationContext());
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View vi=convertView;
        if(convertView==null)
            vi = inflater.inflate(R.layout.list_item, null);

        HashMap<String, Object> data = (HashMap<String, Object>) getItem(position);
        TextView text = (TextView)vi.findViewById(R.id.name);
        String name = (String) data.get(NAME);
        text.setText(name);
        ImageView image=(ImageView)vi.findViewById(R.id.imageView1);
        imageLoader.DisplayImage(IMAGE, (Activity)mContext, image);
        return vi;
    }
}
}

这是imageLoader:

public class ImageLoader {

MemoryCache memoryCache=new MemoryCache();
FileCache fileCache;
private Map<ImageView, String> imageViews=Collections.synchronizedMap(new WeakHashMap<ImageView, String>());

public ImageLoader(Context context){

    photoLoaderThread.setPriority(Thread.NORM_PRIORITY-1);

    fileCache=new FileCache(context);
}

final int stub_id=R.drawable.ic_launcher;
public void DisplayImage(String url, Activity activity, ImageView imageView)
{
    imageViews.put(imageView, url);
    Bitmap bitmap=memoryCache.get(url);
    if(bitmap!=null)
        imageView.setImageBitmap(bitmap);
    else
    {
        queuePhoto(url, activity, imageView);
        imageView.setImageResource(stub_id);
    }    
}

private void queuePhoto(String url, Activity activity, ImageView imageView)
{

    photosQueue.Clean(imageView);
    PhotoToLoad p=new PhotoToLoad(url, imageView);
    synchronized(photosQueue.photosToLoad){
        photosQueue.photosToLoad.push(p);
        photosQueue.photosToLoad.notifyAll();
    }


    if(photoLoaderThread.getState()==Thread.State.NEW)
        photoLoaderThread.start();
}

private Bitmap getBitmap(String url) 
{
    File f=fileCache.getFile(url);


    Bitmap b = decodeFile(f);
    if(b!=null)
        return b;


    try {
        Bitmap bitmap=null;
        URL imageUrl = new URL(url);
        HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
        conn.setConnectTimeout(30000);
        conn.setReadTimeout(30000);
        InputStream is=conn.getInputStream();
        OutputStream os = new FileOutputStream(f);
        Utils.CopyStream(is, os);
        os.close();
        bitmap = decodeFile(f);
        return bitmap;
    } catch (Exception ex){
        ex.printStackTrace();
        return null;
    }
}


private Bitmap decodeFile(File f){
    try {

        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(new FileInputStream(f),null,o);


        final int REQUIRED_SIZE=70;
        int width_tmp=o.outWidth, height_tmp=o.outHeight;
        int scale=1;
        while(true){
            if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
                break;
            width_tmp/=2;
            height_tmp/=2;
            scale*=2;
        }


        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize=scale;
        return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
    } catch (FileNotFoundException e) {}
    return null;
}


private class PhotoToLoad
{
    public String url;
    public ImageView imageView;
    public PhotoToLoad(String u, ImageView i){
        url=u; 
        imageView=i;
    }
}

PhotosQueue photosQueue=new PhotosQueue();

public void stopThread()
{
    photoLoaderThread.interrupt();
}


class PhotosQueue
{
    private Stack<PhotoToLoad> photosToLoad=new Stack<PhotoToLoad>();


    public void Clean(ImageView image)
    {
        for(int j=0 ;j<photosToLoad.size();){
            if(photosToLoad.get(j).imageView==image)
                photosToLoad.remove(j);
            else
                ++j;
        }
    }
}

class PhotosLoader extends Thread {
    public void run() {
        try {
            while(true)
            {

                if(photosQueue.photosToLoad.size()==0)
                    synchronized(photosQueue.photosToLoad){
                        photosQueue.photosToLoad.wait();
                    }
                if(photosQueue.photosToLoad.size()!=0)
                {
                    PhotoToLoad photoToLoad;
                    synchronized(photosQueue.photosToLoad){
                        photoToLoad=photosQueue.photosToLoad.pop();
                    }
                    Bitmap bmp=getBitmap(photoToLoad.url);
                    memoryCache.put(photoToLoad.url, bmp);
                    String tag=imageViews.get(photoToLoad.imageView);
                    if(tag!=null && tag.equals(photoToLoad.url)){
                        BitmapDisplayer bd=new BitmapDisplayer(bmp, photoToLoad.imageView);
                        Activity a=(Activity)photoToLoad.imageView.getContext();
                        a.runOnUiThread(bd);
                    }
                }
                if(Thread.interrupted())
                    break;
            }
        } catch (InterruptedException e) {

        }
    }
}

PhotosLoader photoLoaderThread=new PhotosLoader();


class BitmapDisplayer implements Runnable
{
    Bitmap bitmap;
    ImageView imageView;
    public BitmapDisplayer(Bitmap b, ImageView i){bitmap=b;imageView=i;}
    public void run()
    {
        if(bitmap!=null)
            imageView.setImageBitmap(bitmap);
        else
            imageView.setImageResource(stub_id);
    }
}

public void clearCache() {
    memoryCache.clear();
    fileCache.clear();
}

}

帮助非常感谢。

#1楼 票数:3 已采纳

问题解决了,来自图片的网址有“&amp;” 在里面,这是不明白的。

#2楼 票数:3

现在你可以使用Picasso而不是编写自己的自定义图像加载器。 否则,你的代码帮助了很多。 多谢兄弟。

继承我的适配器使用你的代码与毕加索。

public class CustomList extends SimpleAdapter {

private Context mContext;
public LayoutInflater inflater=null;
public CustomList(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) {
    super(context, data, resource, from, to);
    mContext = context;
    inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View vi=convertView;
    if(convertView==null)
        vi = inflater.inflate(R.layout.list_view_row, null);

    HashMap<String, Object> data = (HashMap<String, Object>) getItem(position);
    TextView text = (TextView)vi.findViewById(R.id.name);
    String name = (String) data.get("name");
    text.setText(name);
    ImageView image=(ImageView)vi.findViewById(R.id.img);
    String image_url = (String) data.get("image_url");
    Picasso.with(mContext).load(image_url).into(image);
    return vi;
  }
}

#3楼 票数:-1

Picasso的解决方案效果很好,只需记住在原始类的'puts'中更改您发送的参数!

为了导入Picasso,将其添加到依赖项中

compile group:'com.squareup.picasso', name:'picasso', version:'2.5.2'

在build.gradle(app)中,单击View - > Tools Windows - > Gradle ,然后按刷新按钮

  ask by Alaa translate from so

未解决问题?本站智能推荐:

3回复

通过简单的适配器在imageview中显示位图图像

我正在从网址获取图像。 我在listview中使用imageview。 我想将位图图像列表添加到列表项的每一行。 我使用SimpleAdapter但是imageview显示为空白。我的代码如下!
2回复

将图像位图添加到简单适配器 Android

我在这里遇到了一些问题。 假设我已经完美地将String转换为Bitmap ,但是当我想使用SimpleAdapter显示到ListView ,它在ImageView显示任何内容。 在这里,我的快照代码: 我已经定义了变量: 这是从 JSON 获取和转换图像: 我想用这个适配器显示图像:
1回复

如何以simpleAdapter表单URL(XML提要)显示图像?

谁能帮助我以simpleAdapter形式的URL显示图像。 我的XML文件中有这些URL。 在我的simpleAdapter中,我有“ R.drawable.imageView1” 我可以显示文字,但无法获取图像。 我有一种方法可以从名为XML的XML中获取网址- .getI
1回复

如何在ListView Android中显示图像

我一直在寻找有关如何执行此操作的示例。 在StackOverflow上介绍了使用SimpleAdapter和HashMaps的方法。 这是我的代码。 没用 我所看到的只是列表的空白行。 image_list_item.xml: list_item.xml: 请告诉
1回复

如何使用SimpleAdapter将下载的图像显示到ImageView

我正在尝试在使用简单适配器创建的listView的相应ImageViews中显示图像。 到目前为止,图像可以很好地下载到磁盘上的某个位置,并且文本数据在listView中可以很好地显示,但是我无法将下载的图像显示到listView项的正确位置。 到目前为止,我的代码看起来像这样...
1回复

Android在列表中动态设置ImageView

我有一个具有以下布局的列表: 我使用异步任务从JSON格式的BD中检索字段,然后将列表填充在onPostExecute函数中,如下所示: 其中MyList是ArrayList: 我的结果JSONArray的每个字段均由“名称”,“姓氏”,“地址”,“电话”和“照片”组成。
1回复

如何在SimpleAdapter中使用ImageLoader类从ImageUrl显示ImageView?

我有以下类来解析JSON并显示名称和其他详细信息,我在列表视图中未提及。 ShowViewActivity.java 我想实现以下ImageDownloader类以显示来自Web URL的图像。 ImageDownloader.java 我看到了扩展BaseAdapte
1回复

如何使用SimpleAdapter在ListView中使ImageView可单击?

我有一个使用SimpleAdapter生成的Listview。 当我单击一行时,我的Listview显示另一个Listview。 我已经在适配器中放置了一个ImageView。 我想使ImageView可单击以更改ImageView的图片。有人可以建议我怎么做吗? 我在下面发布我的代码: