我正在尝试从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();
}
}
答案 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,如果无法取得任何成功,请尝试修复您的网址。
将此方法添加到助手类中,并将其与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库,我的问题就消失了。