Порядок элемента списка (представления) неожиданно изменяется при (быстрой) прокрутке в ListView

Я новичок в Android, и в итоге (должен) задать вопрос здесь,

Давайте сделаем это просто, я просто хочу сделать свой собственный TextView-подобный (MyView расширяет представление),

это мой код:

public class MyView extends View {
    private Paint mPaint;
    private String mText;
    private Bitmap mBitmap1;
    private Bitmap mBitmap2;
    public MyView(Context context) {
        super(context);
        initView();
    }

public MyView(Context context, AttributeSet attrs) {
    super(context, attrs);
    initView();
}

private final void initView() {
    mPaint = new Paint();
}

public void setText(String text) {
    mText = text;
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int measuredWidth = measureWidth(widthMeasureSpec);
    if (mBitmap1 == null) initBitmap1(measuredWidth);
    int measuredHeight = measureHeight(heightMeasureSpec);
    setMeasuredDimension(measuredWidth, measuredHeight);
}

private void initBitmap1(int measuredWidth) {
    mBitmap1 = Bitmap.createBitmap(measuredWidth, Fonts.getHeight(), Bitmap.Config.ARGB_4444);
    Canvas canvas = new Canvas(mBitmap1 );
    canvas.drawText(mText, 0, 0, mPaint);
}

private void initBitmap2() {
    mBitmap2 = Bitmap.createBitmap(30, Fonts.getHeight(), Bitmap.Config.ARGB_4444);
    Canvas canvas = new Canvas(mBitmap2);
    canvas.drawText(mText, 0, 0, mPaint);
}

private int measureWidth(int widthMeasureSpec) {
    int measuredWidth = 0;
    int specWidthMode = MeasureSpec.getMode(widthMeasureSpec);
    int specWidthSize = MeasureSpec.getSize(widthMeasureSpec);

    if (specWidthMode == MeasureSpec.EXACTLY) {
        measuredWidth = specWidthSize;
    } else {
        measuredWidth = getWidth();
        if (specWidthMode == MeasureSpec.AT_MOST) {
            measuredWidth = Math.min(measuredWidth, specWidthSize);
        }
    }
    return measuredWidth;
}

private int measureHeight(int heightMeasureSpec) {
    int measuredHeight = 0;
    int specHeightMode = MeasureSpec.getMode(heightMeasureSpec);
    int specHeightSize = MeasureSpec.getSize(heightMeasureSpec);

    if (specHeightMode == MeasureSpec.EXACTLY) {
        measuredHeight = specHeightSize;
    } else {
        measuredHeight = 80;
        if (specHeightMode == MeasureSpec.AT_MOST) {
            measuredHeight = Math.min(measuredHeight, specHeightSize);
        }
    }
    return measuredHeight;
}

@Override
protected void onDraw(Canvas canvas) {
   super.onDraw(canvas);
   canvas.drawBitmap(mBitmap1, getLeft(), 0, mPaint);
   initBitmap2();
   canvas.drawBitmap(mBitmap2, getLeft(), 30, mPaint);
}

}

в моем коде я заполняю некоторые числа MyView (скажем, 20) в ListActivity

мой вопрос: почему порядок mBitmap1 меняется случайным образом, когда я быстро прокручиваю (вверх-вниз) (если я прокручиваю медленно, эта проблема не возникает) ..?

mBitmap2 остается там, где они должны быть.


person siriusdely    schedule 02.09.2010    source источник
comment
хорошо, проблема была решена в этой теме: группы .google.com/group/android-developers/browse_thread/thread/   -  person siriusdely    schedule 08.09.2010


Ответы (1)


вы должны использовать класс держателя представления, чтобы решить эту проблему. что-то вроде этого:

public View getView(final int i, View view, final ViewGroup viewGroup) {
    View vi = view;
    final ViewHolder holder;
    if (view == null) {
        holder = new ViewHolder();
        vi = inflater.inflate(R.layout.listview_row_cart, null);
        holder.yourbutton = (Button) vi.findViewById(R.id.btn);
        vi.setTag(holder);
    } else {
        holder = (ViewHolder) view.getTag();
    }
        holder.yourbutton.setText("Start");
 }
 class ViewHolder {
       Button yourbutton
}
person Satyavrat    schedule 04.10.2015