我想从不飞溅的照片中获取随机照片并显示在我的应用中。这是我形成的请求网址(与api_key配合使用)。 random photos from unsplash
我已经根据此结构使用getter和setters(省略)创建了模型类,如下所示:
public class UnsplashImages {
public String imageId;
public String rawImg;
public String fullImg;
public String regularImg;
public String smallImg;
public String thumbImg;
public UnsplashImages() {}
public UnsplashImages(String imageId, String rawImg, String fullImg, String regularImg, String smallImg, String thumbImg) {
this.imageId = imageId;
this.rawImg = rawImg;
this.fullImg = fullImg;
this.regularImg = regularImg;
this.smallImg = smallImg;
this.thumbImg = thumbImg;
}
}
根据the docs,该端点将仅返回一个图像,除非在请求url中指定了计数,所以我将计数添加为最大值(30)。
这是计数值> 1的json响应
[
{
id: "7kWEtC4TZlE",
created_at: "2018-02-12T17:28:19-05:00",
updated_at: "2018-05-18T14:03:44-04:00",
width: 3980,
height: 4975,
color: "#FAC9A7",
description: null,
urls: {
raw: "https://images.unsplash.com/photo-1518474436123-0e44861523f7?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjI4ODUzfQ&s=6d9ef54c8c96afc3fbd6cd9aca9e2cf6",
full: "https://images.unsplash.com/photo-1518474436123-0e44861523f7?ixlib=rb-0.3.5&q=85&fm=jpg&crop=entropy&cs=srgb&ixid=eyJhcHBfaWQiOjI4ODUzfQ&s=e12d5951d3907a1917eb9c1a1c2b67e4",
regular: "https://images.unsplash.com/photo-1518474436123-0e44861523f7?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjI4ODUzfQ&s=da9be90c5000190c773f31969059fdae",
small: "https://images.unsplash.com/photo-1518474436123-0e44861523f7?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjI4ODUzfQ&s=7630a6850ad1e87dfd580f5066482ee5",
thumb: "https://images.unsplash.com/photo-1518474436123-0e44861523f7?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=200&fit=max&ixid=eyJhcHBfaWQiOjI4ODUzfQ&s=fb527398e3ee3e8c411674fd0a65ce5b"
},
links: {},
categories: [ ],
sponsored: false,
likes: 54,
liked_by_user: false,
current_user_collections: [ ],
slug: null,
user: {},
exif: {},
location: {},
views: 262012,
downloads: 876
},
{},
.
.
.
}
在我的片段中,我完成了json解析,如下所示:
String s = Constants.RANDOM_PHOTOS + "&count=30";
Log.d(TAG, "Unsplash Misc URL:\t" + s);
AndroidNetworking.get(s)
.addHeaders("Accept-Version", "v1")
.addHeaders("CLIENT-ID", Constants.UNSPLASH_ACCESS_KEY)
.setTag("Unsplash Scifi req")
.setPriority(Priority.HIGH)
.getResponseOnlyFromNetwork()
.build()
.getAsJSONArray(new JSONArrayRequestListener() {
@Override
public void onResponse(JSONArray response) {
Log.d(TAG, "Un-Response:\t" + response.toString());
if (response != null){
try {
JSONArray jsonArray = new JSONArray(response.toString());
UnsplashImages images = new UnsplashImages();
for (int m = 0; m < jsonArray.length(); m++){
JSONObject object = jsonArray.getJSONObject(m);
images.setImageId(object.getString("id"));
JSONObject urls = object.getJSONObject("urls");
images.setRawImg(urls.getString("raw"));
images.setFullImg(urls.getString("full"));
images.setRegularImg(urls.getString("regular"));
images.setSmallImg(urls.getString("small"));
images.setThumbImg(urls.getString("thumb"));
objectList.add(images);
adapter.notifyDataSetChanged();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
@Override
public void onError(ANError anError) {
}
});
这是适配器代码:
public class MiscAdapter extends RecyclerView.Adapter<WallpaperItemViewHolder> {
private static final String TAG = MiscAdapter.class.getSimpleName();
private final Context context;
private List<Object> itemsList;
private UnsplashImages unsplashImages;
public MiscAdapter(Context context, List<Object> itemsList) {
this.context = context;
this.itemsList = itemsList;
}
@Override
public WallpaperItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.wallpaper_items_layout, parent, false);
return new WallpaperItemViewHolder(view);
}
@Override
public void onBindViewHolder(final WallpaperItemViewHolder viewholder, final int position) {
unsplashImages = (UnsplashImages) itemsList.get(position);
Picasso.with(context)
.load(unsplashImages.getRegularImg())
.placeholder(R.drawable.drawer_header_trimmed)
.into(viewholder.wallpaperItemImg);
viewholder.favoriteWP_IV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Favorites favorites = new Favorites();
favorites.setFavoritesId(UUID.randomUUID().toString());
favorites.setLargeImgURL(unsplashImages.getRegularImg());
favorites.setPreviewImgURL(unsplashImages.getRegularImg());
favorites.save();
Log.d(TAG, "Fav id:\t" + favorites.getId());
Toast.makeText(context, "Added to Favorites", Toast.LENGTH_SHORT).show();
}
});
viewholder.setWallPaper_TV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final WallpaperManager wpm = WallpaperManager.getInstance(context);
Picasso.with(context)
.load(((UnsplashImages) itemsList.get(position)).getRegularImg())
.into(new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
try {
wpm.setBitmap(bitmap);
Toast.makeText(context, "Your New Wallpaper Has Been Set", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
Log.d(TAG, "Bitmap Load Failed");
Toast.makeText(context, "Could Not Set Wallpaper...Choose Another", Toast.LENGTH_SHORT).show();
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
Log.d(TAG, "Prep to Load Bitmap");
}
});
}
});
}
@Override
public int getItemCount() {
if (itemsList == null) {
return 0;
}
return itemsList.size();
}
}
图像显示在recyclerview列表中,但是同一图像在列表中显示了30次,而不是不同的项目。这是我的json解析问题还是其他问题?。
答案 0 :(得分:0)
我为您致歉。我已通过在如下所示的for循环中声明模型类的新实例来解决此问题:
for (int m = 0; m < jsonArray.length(); m++) {
JSONObject object = jsonArray.getJSONObject(m);
UnsplashImages images = new UnsplashImages(); // this here
images.setImageId(object.getString("id"));
JSONObject urls = object.getJSONObject("urls");
images.setRawImg(urls.getString("raw"));
images.setFullImg(urls.getString("full"));
images.setRegularImg(urls.getString("regular"));
images.setSmallImg(urls.getString("small"));
images.setThumbImg(urls.getString("thumb"));
objectList.add(images);
adapter.notifyDataSetChanged();
}
对于将来的观察者,请注意。谢谢。