从Json数据中获取图像并在RecyclerView android中将其显示为封面图像

时间:2017-08-22 10:19:18

标签: java android json deserialization picasso

我正在尝试从Rest Api获取json数据,对其进行反序列化并将其显示给RecyclerView。

我正在使用改装1.9。在JSONArray中,我可以在logcat中看到数据api。

我可以反序列化json数组之外的数据,如正文,标题等。

但是在json中有一些像Array的图像。我为appimage和testImage创建了两个静态内部类。

AppImage有3或4张图片。测试图像只有一个图像源。

首先,我想让TeaserimageSample将其设置为RecyclerView标题图像。

我正在尝试从中获取src值。但无法理解如何做到这一点。

我还想知道我的模型类是否基于给定的JSON是正确的。我已在代码中详细解释过。

已编辑的控制器类

#include <msclr\marshal.h>

我编辑的适配器类我将Picasso设置为封面图像的图像。但我仍然无法在recyclerview中看到任何内容

    public class NewsController {
    private static final String TAG = NewsController.class.getSimpleName();
    private UserCallbackListener mListener;
    private NewsRestApiManager mApiManager;

    public NewsController(UserCallbackListener listener) {
        mListener = listener;
        mApiManager = new NewsRestApiManager();
    }

    public void startFetching(){

        mApiManager.getNewsApi().getNews(new Callback<String>() {

            @Override
            public void success(String s, Response response) {
                Log.d(TAG, "JSON :: " + s);

                try {
                    JSONArray array = new JSONArray(s);

                    for(int i = 0; i < array.length(); i++) {
                        JSONObject object = array.getJSONObject(i);

                        NewsModel news = new NewsModel();
                        news.setTitle( object.optString( "title") );
                        news.setBody( object.optString( "body" ) );

                        ArrayList<NewsModel.AppImage> list = new ArrayList();
                        JSONArray imageArray =object.getJSONArray("appImages");
                        for(int j=0; j<imageArray.length();j++){
                            NewsModel.AppImage appImages  = new NewsModel.AppImage();
                            appImages.setSrc(imageArray.getJSONObject( j ).getString( "src" ));
                            list.add(appImages);
                        }
                        news.setAppImages( list );

                        JSONObject jo=object.getJSONObject( "teaserImageSmall​" );
                        NewsModel.TeaserImageSmall coverImage=new NewsModel.TeaserImageSmall();
                        coverImage.setSrc( jo.optString( "src" ));
                        news.setTeaserImageSmall(coverImage);
                        mListener.onFetchProgress(news);

                    }

                } catch (JSONException e) {
                    mListener.onFetchFailed();
                }


                mListener.onFetchComplete();
            }

            @Override
            public void failure(RetrofitError error) {
                Log.d(TAG, "Error :: " + error.getMessage());
                mListener.onFetchComplete();
            }
        });

    }
    public interface UserCallbackListener{
        void onFetchStart();
        void onFetchProgress(NewsModel news);
        void onFetchProgress(List<NewsModel> userList);
        void onFetchComplete();
        void onFetchFailed();
    }
}

4 个答案:

答案 0 :(得分:1)

appImages.setSrc( imageArray.optString( Integer.parseInt( "src" )

这会显示您的错误,因为您正在将“src”作为String接收并尝试将其用作int

答案 1 :(得分:0)

您可以直接在网上显示图片,而无需使用

下载
public static Drawable loadImage(String url) {
    try {
        InputStream inputStream = (InputStream) new URL(url).getContent();
        return Drawable.createFromStream(is, "src name");
    } catch (Exception e) {
        return null;
    }
}

并将其设置为ImageView。

否则你可以使用像picasso这样的库,用

Picasso.with(context)
   .load(url)
   .placeholder(R.drawable.placeholder) //optional
   .resize(width, height)               //optional  
   .into(image);                        //your image view

Here关于一些毕加索替代品的讨论(Imageloader,Fresco,Glide)

答案 2 :(得分:0)

正如你在回复中看到的那样:

"appImages": [
  {
    "alt": "",
    "src": "http://www.blu-pa.com/sites/www.blu-pa.com/files/DSC_7549.JPG",
    "_id": "599b39a20dbf4e002b875f71"
  },
  {
    "alt": "",
    "src": "http://www.blu-pa.com/sites/www.blu-pa.com/files/DSC_7531.JPG",
    "_id": "599b39a20dbf4e002b875f70"
  },
  {
    "alt": "",
    "src": "http://www.blu-pa.com/sites/www.blu-pa.com/files/DSC_7349.JP",
    "_id": "599b39a20dbf4e002b875f6f"
  },
  {
    "alt": "",
    "src": "http://image4.JPG",
    "_id": "599b39a20dbf4e002b875f6e"
  },
  {
    "alt": "",
    "src": "http://image4.JPG",
    "_id": "599b39a20dbf4e002b875f6d"
  }
],

appImages是jsonArray,要从中获取src的值,你需要首先从json对象获取jsonobject src的字符串值,如下所示:

JSONArray imageArray =object.getJSONArray("appImages");
for(int j=0; j<imageArray.length();j++){
     NewsModel.AppImage appImages  = new NewsModel.AppImage(); 
     appImages.setSrc(imageArray.getJsonObject(j).getString("src"));

}

list.add(appImages); //how to add image after iteration

试试这个

答案 3 :(得分:0)

有两种可能性。

  • 第一个是你的imageView的高度属性是zore。
  • 第二个是您的网址不足以加载图片。

首先尝试将有效高度设置为imageView,如果无法取得任何成功,请尝试修复您的网址。

修复网址

将此方法添加到助手类中,并将其与Picasso或Glide一起使用;

public static String getUrl(String the_url){
    try {
        URI uri = null;
        URL url = new URL(the_url);
        uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
        return uri.toASCIIString();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }
    return "no_image_url";
}

您的代码应该是;

Picasso.with(holder.itemView.getContext()).load(MyHelper.getUrl(currentNews.getTeaserImageSmall().getSrc())).into( holder.newsImage );

当您通过浏览器打开图像时,您可以看到图像,但有时Android无法找到该图像。通过这个网址对话,Picasso或Glide可以找到网址。

在使用Picasso库时我也遇到过这个问题。我无法修复它,然后我迁移到Glide库,我的问题就消失了。