user interface - Cancelar desplazamiento en Administrador de diseño
user-interface blackberry (2)
No puedo encontrar una solución para el siguiente problema. Tengo el campo de lista personalizada, que se superpone con los límites de su administrador de diseño. El campo Lista consume eventos de navegación del administrador para resaltar la fila actualmente seleccionada con un color especial. El administrador de diseño está configurado para admitir el desplazamiento. Cuando muevo la rueda de desplazamiento hacia abajo, el administrador de diseño invoca el desplazamiento y luego pasa el evento de navegación a su hijo, el campo de lista. Provoca un desplazamiento interno inadecuado, ya que el administrador desplaza la lista completa hasta las filas inferiores de la lista de ocultación, incluida la fila seleccionada.
Lo que quiero es ignorar el desplazamiento mientras la fila de la lista actualmente seleccionada sigue siendo visible y emplearla de lo contrario.
Estoy usando JDE 4.2.1
Digamos que tenemos implementación de ListField:
class LabelListField extends ListField implements ListFieldCallback {
private Vector mValues;
public LabelListField(Vector values) {
super(0);
setRowHeight(getFont().getHeight() + 10);
setCallback(this);
mValues = values;
setSize(mValues.size());
}
public void drawListRow(ListField listField, Graphics g, int index, int y,
int width) {
g.drawText((String) mValues.elementAt(index), 0, y);
}
public Object get(ListField list, int index) {
return mValues.elementAt(index);
}
public int indexOfList(ListField list, String prefix, int start) {
for (int x = start; x < mValues.size(); ++x) {
String value = (String) mValues.elementAt(x);
if (value.startsWith(prefix)) {
return x;
}
}
return -1;
}
public int getPreferredWidth(ListField list) {
return Display.getWidth();
}
}
Si queremos alinear esta lista en los campos superiores e inferiores de esta manera: ListField con scroll http://img6.imageshack.us/img6/7025/8800j.png
podemos limitar su altura usando el administrador personalizado:
class ListManager extends HorizontalFieldManager {
ListField mListField;
public ListManager(ListField listField) {
super(VERTICAL_SCROLL | VERTICAL_SCROLLBAR);
mListField = listField;
add(mListField);
}
public int getPreferredHeight() {
int result = Display.getHeight();
Manager manager = getManager();
if (null != manager) {
for (int i = 0, count = manager.getFieldCount(); i < count; i++) {
if (manager.getField(i) != this)
result -= manager.getField(i).getPreferredHeight();
}
}
// size down to fit max rows without splitting
result = result - result % mListField.getRowHeight();
return result;
}
protected void sublayout(int maxWidth, int maxHeight) {
super.sublayout(maxWidth, maxHeight);
setExtent(maxWidth, getPreferredHeight());
}
}
Ahora podemos usarlo:
class Scr extends FullScreen implements FieldChangeListener {
LabelField mHeader;
ListManager mHFMList;
HorizontalFieldManager mHFMButton;
LabelListField mListField;
ButtonField mButton;
public Scr() {
super(DEFAULT_MENU | DEFAULT_CLOSE);
mHeader = new LabelField("List Field", FIELD_HCENTER);
add(mHeader);
Vector values = new Vector();
values.addElement("first");
values.addElement("second");
values.addElement("third");
values.addElement("fourth");
values.addElement("fifth");
values.addElement("sixth");
values.addElement("seventh");
values.addElement("eight");
mListField = new LabelListField(values);
mHFMList = new ListManager(mListField);
add(mHFMList);
mHFMButton = new HorizontalFieldManager(FIELD_HCENTER);
add(mHFMButton);
mButton = new ButtonField("Exit", ButtonField.CONSUME_CLICK);
mButton.setChangeListener(this);
mHFMButton.add(mButton);
}
public void fieldChanged(Field field, int context) {
if (mButton == field)
close();
}
}
Probado en eJDE 4.2.1.17 8800
todos aquí están la solución que me ayudó. Al anular moveFocus de una manera tan específica, pude modificar el comportamiento predeterminado de desplazamiento en el administrador de diseño: se saltea los primeros elementos del campo de lista, lo que les permite mantenerse en la parte superior.
public int moveFocus(int amount, int status, int time) {
invalidate(getSelectedIndex());
int unused = super.moveFocus(amount, status, time);
return Math.abs(unused) + 1;
}