Как динамически удалять растровые изображения из страничного адаптера Viewpager ArrayList - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть вид пейджер и адаптер страницы следующим образом:

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, чтобы избежать проблем с памятью. Есть ли способ добиться этого?

...