Json数组相同对象重复次数

时间:2018-06-20 00:32:29

标签: android json android-recyclerview

我想从不飞溅的照片中获取随机照片并显示在我的应用中。这是我形成的请求网址(与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解析问题还是其他问题?。

1 个答案:

答案 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();

                            }

对于将来的观察者,请注意。谢谢。