列表项(视图)为了unexpextedly变化而(快)在ListView滚动
问题描述:
我是新来的机器人,并结束了(得)这里问一个问题,列表项(视图)为了unexpextedly变化而(快)在ListView滚动
让我们把它简单,我只是想让我自己般的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的的一些数字(LE我的问题是为什么mBitmap1的顺序随机变化,而我快速滚动 (上下)(如果我滚动缓慢,这个问题不会发生)..?????????????
mBitmap2会留在那些应该..
答
你必须使用一个视图holder类为了克服这个问题。是这样的:
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
}
还好,问题在这个线程被sholved:http://groups.google.com/group/android-developers/browse_thread/thread/e508e2d20b1fcda9/0785597e31b51cd3#0785597e31b51cd3 – siriusdely 2010-09-08 03:19:41