2010-09-02 2 views
7

Ich bin neu in Android, und am Ende (müssen), eine Frage stellen hierListenelement (eine Ansicht) ändert, um unexpextedly während (schnell) in einem Listview Scrollen

Sagen wir es einfach machen, ich wollen einfach zu machen, meine eigene Textview-like (MyView erstreckt View),

dies ist mein 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 meinem Code, ich bevölkern einige Zahlen von MyView (le t sagen, 20) in einem ListActivity

meine Frage ist, warum um mBitmap1 die Änderungen zufällig während ich (oben-unten scrollen) fastly (wenn ich langsam bewegen, dieses Problem nicht auftreten) ..?

mBitmap2 bleibt, wo diejenigen sein sollten ..

+2

in Ordnung, hat sich das Problem in diesem Thread sholved worden: http://groups.google.com/group/android-developers/browse_thread/thread/e508e2d20b1fcda9/0785597e31b51cd3#0785597e31b51cd3 – siriusdely

Antwort

0

Sie einen Blick Inhaber Klasse, um dieses Problem zu überwinden, verwenden müssen. so etwas wie dieses:

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 
} 
Verwandte Themen