El elemento de lista (una vista) cambia de orden sin que suceda mientras se desplaza (rápido) en un ListView

Soy nuevo en android, y terminé (tengo que) hacer una pregunta aquí,

Vamos a hacerlo simple, simplemente quiero hacer mi propio TextView-like (MyView extends View),

Este es mi código

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

}

En mi código, i poblar algunos números de MyView (digamos 20) en un ListActivity

Mi pregunta es la razón por la orden de mBitmap1 cambia al azar mientras me desplazo (arriba hacia abajo) rápidamente (si me desplazo lentamente, este problema no ocurre) ..?

MBitmap2 se queda donde deberían estar ..

Debe utilizar una clase de tenedor de vista para superar este problema. algo como esto:

 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 } 
  • Agregar un botón al elemento ExpandableListView Group
  • Creación de una vista en forma de calendario con desplazamiento infinito en Android
  • Dibujar un rectángulo detrás de ImageView personalizado que no anima
  • Cómo crear un pulldown personalizado en el Honeycomb ActionBar?
  • SurfaceView personalizado que causa NoSuchMethodException
  • Android: cambiar el tamaño de vistas personalizadas. Se cambia el tamaño del padre, pero los cambios de ancho / altura no se transmiten a la vista secundaria
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.