Я бы использовал другой подход к вашей проблеме. Я бы построил FredboardView
, который способен рисовать выделенную заметку в методе onDraw
. Это представление может быть добавлено в ваш макет XML. Если вы хотите выделить заметку, у представления должен быть способ сделать это, например setHihglightedNote(note)
, и вам не нужно будет добавлять что-то в макет каждый раз, когда пользователь что-то делает.
EDIT:
Пример пользовательского представления, которое рисует некоторые элементы рисования в соответствии с позицией.
public class PositionIndicator extends View {
private static final int OFFSET = 2;
private Drawable on, off;
private int width, height;
private int size = 5;
private int position = 0;
private Paint paint;
public PositionIndicator(Context context, AttributeSet attrs) {
super(context, attrs);
// init
on = context.getResources().getDrawable(R.drawable.dot_green);
off = context.getResources().getDrawable(R.drawable.dot_grey);
paint = new Paint();
paint.setARGB(0, 0, 0, 0);
}
/**
* Set size of indicator.
* @param size Size.
*/
public void setSize(int size) {
if(size >= 0)
this.size = size;
this.invalidate();
}
/**
* Set position of indicator.
* @param position Position.
*/
public void setPosition(int position) {
if(position >= 0 && position <= size)
this.position = position;
this.invalidate();
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch(msg.what) {
case C.POSITION_CHANGED:
setPosition(msg.arg1);
break;
}
}
};
public Handler getHandler() {
return handler;
}
/**
* {@inheritDoc}
*/
@Override
public void onDraw(Canvas canvas) {
// draw transparent rectangle to clean area
canvas.drawRect(0, 0, this.getWidth(), this.getHeight(), paint);
for(int i = 0; i < size; i++) {
// draw current
if(i+1 == position) {
on.setBounds(i*width+i*OFFSET, 0, i*width+i*OFFSET+width, height);
on.draw(canvas);
// draw others
} else {
off.setBounds(i*width+i*OFFSET, 0, i*width+i*OFFSET+width, height);
off.draw(canvas);
}
}
}
/**
* {@inheritDoc}
*/
@Override
protected void onMeasure(int width, int height) {
super.onMeasure(width, height);
setMeasuredDimension(this.getMeasuredWidth(), this.getMeasuredHeight());
this.width = (this.getMeasuredWidth() - ((size-1) * OFFSET)) / size;
this.height = this.getMeasuredHeight();
}
}