Пользовательский вид в recyclerview не отображается после прокрутки

#android #android-recyclerview #android-canvas

#Android #android-recyclerview #android-холст

Вопрос:

У меня есть пользовательский вид, который рисует вогнутую форму (визуализируется красным прямоугольником на скриншоте). Этот пользовательский вид является частью моего макета элемента recycler view, который также содержит обычный вид с цветом фона (правая часть).

Это выдержка из моего пользовательского вида (без поворота, но с теми же методами рисования):

     public class InvertedCircleView extends View {

    private Paint mPaint;
    private float mCanvasCenterX;

    private float mCenterCircleWidth, mCenterCircleHeight;


    public InvertedCircleView(Context context, AttributeSet attrs) {
        super(context, attrs);

        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);

     [...]
        mPaint.setStyle(Paint.Style.FILL);
        canvas.drawPaint(mPaint);

        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

        mCenterCircleWidth = canvas.getWidth();        
        mCenterCircleHeight = canvas.getHeight();        

        mCanvasCenterX = canvas.getWidth() / 2;

        canvas.drawOval(mCanvasCenterX - (mCenterCircleWidth / 2),
                -mCenterCircleHeight,
                mCanvasCenterX   (mCenterCircleWidth / 2),
                mCenterCircleHeight,
                mPaint);
    }
 }
  

Когда recyclerview отображается в первый раз, все выглядит нормально. Но когда я прокручиваю вниз (или вверх), часть пользовательского вида не отображается на всех новых элементах.

Что я тестировал до сих пор:

  • setItemViewCacheSize -> это помогает, но при повторной прокрутке вверх отображается тот же плохой результат
  • notifyDataSetChanged -> это напрямую приводит к «неправильной» визуализации для всех элементов

В чем может быть причина такого поведения?

введите описание изображения здесь

Ответ №1:

Нашел свою ошибку: Я использовал «mPaint.setXfermode(новый PorterDuffXfermode(PorterDuff.Mode.ОЧИСТИТЬ));» в onDraw-функции. Но в конце я забыл сбросить Xfermode.

Я добавил строку «mPaint.setXfermode(null);» и все работает, как ожидалось 🙂