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



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

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

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

但是在 json 中有一些图像作为数组。我已经为 appimage 和 testImage 创建了两个静态内部类。

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

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

我正在尝试从中获取 src 值。但无法得到它如何做。

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

已编辑的控制器类

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();
}
}

编辑的适配器类,我在其中设置 Picasso 以设置封面图像的图像。但我仍然在回收器视图中看不到任何东西

...............
// create new views (invoked by the layout manager)
@Override
public NewsHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.news_row_layout,parent,false);
return new NewsHolder(view);
}
@Override
public void onBindViewHolder(NewsHolder holder, int position) {
final NewsModel currentNews = mNews.get(position);
Picasso.with(holder.itemView.getContext());
Picasso.with(holder.itemView.getContext()).load(currentNews.getTeaserImageSmall().getSrc()).into( holder.newsImage );
holder.newsImage.setImageResource( R.drawable.image1 );
holder.newsHeadline.setText(currentNews.getTitle());
holder.newsDate.setText(currentNews.getPostDate());
}
@Override
public int getItemCount() {
return mNews.size();
}

public class NewsHolder extends RecyclerView.ViewHolder {
public CardView cardView;
public ImageView newsImage;
public TextView newsHeadline;
public TextView newsDate;
public NewsHolder(View itemView) {
super(itemView);
newsImage=(ImageView)itemView.findViewById(R.id.news_picture);
newsHeadline=(TextView)itemView.findViewById(R.id.news_headline);
newsDate=(TextView) itemView.findViewById(R.id.news_date);
cardView=(CardView)itemView.findViewById(R.id.cardview_news);
}
}
}

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

这向您显示错误,因为您正在接收"src"作为String并尝试将其用作int

您可以直接从网络显示图像,而无需下载

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;
}
}

并将其设置为图像视图。

否则,您可以使用像毕加索这样的库,与

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

这里讨论了一些毕加索的替代品(图像加载器,壁画,滑翔(

有两种可能性。

  • 第一个是你的图像视图的高度属性是zore。
  • 第二个是您的URL不够正确,无法加载图像。

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

修复网址

将此方法添加到您的帮助程序类中,并将其与毕加索或 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无法找到该图像。通过这个网址对话,毕加索或格莱德可以找到网址。

我在与毕加索图书馆合作时也遇到了这个问题。我无法修复它,然后我迁移到 Glide 库,我的问题就消失了。

正如您在响应中看到的:

"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 的字符串值,如下所示:

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

试试这个

最新更新