位图以错误的顺序添加到ArrayList

时间:2015-07-28 09:21:40

标签: java android

我在我的数据库中有一篇文章,其中包含图片,标题和价格。我将标题和价格添加到每个数组中,它们的顺序正确,因此价格与标题相符。但是当我加载图像时,我会像这样解码它:

    private Bitmap decodeFile(byte[] b) {
        // Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeByteArray(b, 0, b.length, o);

        // The new size we want to scale to
        final int REQUIRED_SIZE=200;

        // Find the correct scale value. It should be the power of 2.
        int scale = 1;
        while(o.outWidth / scale / 2 >= REQUIRED_SIZE && 
              o.outHeight / scale / 2 >= REQUIRED_SIZE) {
            scale *= 2;
        }

        // Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        return BitmapFactory.decodeByteArray(b, 0, b.length, o2);
    }

解码完成后,我将它添加到图像ArrayList中,如下所示:

imageList.add(bmp);

然后图像的价格和标题可以是例如在价格和标题ArrayLists中的索引0,但图像可能比另一个图像解码慢,所以如何在索引0处添加图像?这是我加载和添加的总代码:

    private void loadData(){
        ParseQuery<ParseObject> query = ParseQuery.getQuery("Items");
        query.setLimit(20);
        query.findInBackground(new FindCallback<ParseObject>() {
            public void done(List<ParseObject> itemList, ParseException e) {
                if (e == null) {
                    Log.d("Parse", "Retrieved " + itemList.size() + " items");
                    itemsLoaded = itemList.size();
                    for (int i = 0; i < itemList.size(); i++){
                        pricesList.add(itemList.get(i).getInt("price"));
                        titlesList.add(itemList.get(i).getString("title"));
                        Log.d("Parse", "objectID = " + itemList.get(i).getObjectId());
                    }                       
                } else {
                    Log.d("Parse", "Error: " + e.getMessage());
                }
                for (int j = 0; j < titles.size(); j++){
                    ParseQuery<ParseObject> query2 = ParseQuery.getQuery("Images");
                    query2.whereEqualTo("imageId", itemList.get(j).getObjectId());
                    query2.findInBackground(new FindCallback<ParseObject>() {
                        public void done(List<ParseObject> picList, ParseException e) {
                            if (picList.size() != 0){
                            ParseFile pFile = (ParseFile) picList.get(0).get("image");

                            pFile.getDataInBackground(new GetDataCallback() {
                                public void done(byte[] data, ParseException e) {
                                    if (e == null) {
                                        Log.d("Parse", "We've got data in data.");
                                        Bitmap bmp = decodeFile(data);
                                        imageList.add(bmp);                                         
                                        if (imageList.size() == titles.size())
                                            updateGridView();   
                                    } else {
                                        Log.d("test", "There was a problem downloading the data.");
                                    }
                                }                                   
                            });
                            }
                            Log.d("Parse", "Downloaded images = " + picList.size());
                        }
                    }); 
                }
            }

        });
    }

3 个答案:

答案 0 :(得分:1)

正如我评论的那样:我会使用Map,您可以在其中为每个值定义一个键。关键可能是唯一的产品编号。如果将此策略用于所有单独的属性,则不依赖于不同加载过程中的计时问题。

在处理内存使用方面的最佳性能时,其他答案中描述的技术非常有趣。延迟加载可能需要更长时间才能实际显示图像,但它会节省工作内存,因为您不会将所有图像都存储在内存中。

答案 1 :(得分:0)

您好您可以使用Lazy列表正确加载图像。参考http://androidtutorialbd.blogspot.in/2013/03/lazy-list-view.html

答案 2 :(得分:0)

我认为如果你有一个带有图像的Article类(或者可能更好地引用图像,所以你只需要在需要时解码它们),标题和价格变量应该会更好。当您加载数据时,您创建了article ...这样您确定文章的图像,标题和价格都是正确的......

现在你依赖于3个列表的顺序,所以错误肯定会发生!