List item (view) changes slowly while (quick) scrolling in ListView

I'm new to android, and in the end I had to ask a question,

Let me make it simple, I just want to make my own TextView-like (MyView extends View)

this is my code:

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); } 

}

in my code, I populate some MyView numbers (say 20) in ListActivity

My question is why the order of mBitmap1 changes randomly while I scroll (up and down) quickly (if I scroll slowly, this problem does not occur).?

mBitmap2 stays where they should be.

+7
android listactivity
source share
1 answer

you must use the view holder class to deal with this problem. something like that:

 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 } 
0
source share

All Articles