Векторная загрузка с возможностью рисования в RecyclerView

Мне нужно загрузить ресурсы VectorDrawable в зависимости от разных случаев в просмотры изображений в режиме ресайклера. Текущая реализация каждый раз создает новую возможность рисования, что, я уверен, приводит к потере производительности с огромным количеством элементов в списке. Я хочу изменить его, чтобы чертежи эффективно использовались повторно для уменьшения количества создаваемых объектов. Я использую Picasso, и я подумал, что было бы неплохо делегировать ему эту работу, но похоже, что Picasso не может загрузить VectorDrawable. Есть ли способ справиться с этим?

UPD. Ресурс загружается с помощью ContextCompat.getDrawable и устанавливается с помощью setImageDrawable. ImageView drawable очищается в onViewRecycled

показать код, чтобы увидеть, что вы делаете?

Kaveesh Kanwal 28.03.2018 14:26

@KaveeshKanwal, кода не так много. Ресурс загружается с помощью ContextCompat.getDrawable и устанавливается с помощью setImageDrawable. Возможность рисования ImageView очищена в onViewRecycled. Дело в том, что ContextCompat.getDrawable вызывается каждый раз, что приводит к построению объекта.

f3ell0w 28.03.2018 14:31

Я хочу знать, есть ли способ кэшировать чертежи во всем приложении для последующего использования.

f3ell0w 28.03.2018 14:32
0
3
518
1

Ответы 1

Единственное решение, которое я могу придумать, - это переместить загрузку динамических изображений с возможностью рисования из потока пользовательского интерфейса в фоновый поток. Чтобы сделать загрузку более плавной, вам необходимо загружать изображения асинхронно, используя AsyncTask в вашем адаптере. Это снимет нагрузку с потока пользовательского интерфейса и сделает работу пользователя намного лучше. Вы не можете использовать Picasso, поэтому я рекомендую простую AsyncTask.

Я нашел для этого хороший фрагмент, посмотрите:

public View getView(int position, View convertView,
        ViewGroup parent) {
    ViewHolder holder;

    ...

    holder.position = position;

    new ThumbnailTask(position, holder)
            .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);

    return convertView;
}

private static class ThumbnailTask extends AsyncTask {
    private int mPosition;
    private ViewHolder mHolder;

    public ThumbnailTask(int position, ViewHolder holder) {
        mPosition = position;
        mHolder = holder;
    }

    @Override
    protected Cursor doInBackground(Void... arg0) {
        // Download bitmap here
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (mHolder.position == mPosition) {
            mHolder.thumbnail.setImageBitmap(bitmap);
        }
    }
}

private static class ViewHolder {
    public ImageView thumbnail;
    public int position;
}

Для получения дополнительной информации, пожалуйста, посмотрите ссылку это.

Другие вопросы по теме