如何从Viewpager pageadapter ArrayList动态删除位图

时间:2018-09-09 18:08:39

标签: android android-viewpager android-pageradapter

我有一个查看寻呼机和页面适配器,如下所示:

public class QuotePagerAdapter extends PagerAdapter {
    Activity context;
    JsonArray templates;
    JsonArray mainQuotesArray;

    private List<Bitmap> generateList;

    QuotePagerAdapter(Activity context, JsonArray templates, JsonArray mainQuotesArray) {
        this.templates = templates;
        this.mainQuotesArray = mainQuotesArray;
        generateList = new ArrayList<>();
        this.context = context;
        generateAutoQuote();
    }

    @Override
    public int getCount() {
        return generateList.size();
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == ((ImageView) object);
    }

    @Override
    public int getItemPosition(Object object) {
        if (generateList.contains((View) object)) {
            return generateList.indexOf((View) object);
        } else {
            return POSITION_NONE;
        }
    }


    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Log.i("SIZE", String.valueOf(generateList.size()));
        Log.i("POS", String.valueOf(position));
        if (generateList.size() <= position) {
            return null;
        }

        Bitmap image = generateList.get(position);
        ImageView imageView = new ImageView(context);
        RelativeLayout.LayoutParams imageLayout = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT
        );

        imageLayout.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
        imageView.setLayoutParams(imageLayout);

        imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
        imageView.setImageBitmap(image);

        imageView.setMaxHeight(image.getHeight());
        imageView.setMaxWidth(image.getWidth());
        ((ViewPager) container).addView(imageView, 0);


        if (position + 1 == generateList.size()) {
            generateAutoQuote();
            notifyDataSetChanged();
        }


        return imageView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        ((ViewPager) container).removeView((ImageView) object);
    }


     public void generateAutoQuote() {

   // code to generate a bitmap and add to list

                    generateList.add(bitmapOut);

            }
        }

现在

if (position + 1 == generateList.size()) {
            generateAutoQuote();
            notifyDataSetChanged();
        }

此代码将生成图像并将其添加到列表,然后在数据将要消耗时调用notifyDataSetChanged。因此,我实现了对数据的无限刷卡。

现在,当我将位图存储在列表中时,随着用户在其中滑动位图,位图的大小会增加,在某个时间点会发生内存溢出。因此,我正在考虑在列表达到阈值时删除第一项。例如:

如果列表大小为20,我将删除第一项并致电notifyDataSetChanged

因此,我可以将列表大小始终保持在20以内,以避免出现内存问题。有什么办法可以做到这一点?

0 个答案:

没有答案