黑莓懒惰装载在笨拙的布局

时间:2011-11-05 12:16:00

标签: blackberry blackberry-jde

我通过扩展VerticalFieldManager使用自定义列表字段,而对于我正在使用的另一个扩展Manager的CustoRowManager的行。 CustomRowManager有2个TextField和一个BitmapField。此列表是针对实时xml订阅源实现的。为了加载位图字段,我正在显示占位符,然后由背景线程中的实际图像替换。我无法弄清楚如何用bitmapfield替换占位符。使用invalidate()是一个选项,但我应该在哪个元素上执行它。

public class CustomList extends VerticalFieldManager{
private int totalHeight = 0;
private int screenHeight = 0;
private int scrollPosition = 0;

protected void sublayout(int width, int height)
{
    width = 480;
    height = 230;
            super.sublayout(width,height);
    setExtent(width, height);
}   

protected boolean navigationClick(int status, int time)
{
    int index;
    System.out.println("CLICKED!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
    if ((status & KeypadListener.STATUS_FOUR_WAY) == KeypadListener.STATUS_FOUR_WAY) 
        {           
        index = this.getFieldWithFocusIndex();
        UiApplication.getUiApplication().pushScreen(new TopNewsScreen(_vec, index));
        }
    return true;
}   

Bitmap _bmp = null;
BitmapField _bmF = null;
Object _Obj = null;
TopNews _topNews = null;
String _headStr = null, _metaStr = null;
CustTextField _headNews = null, _metaData = null;
CustomRow _custRow = null;
Vector _vec;

public CustomList(Vector _vec,long _property)
{
    super(_property);
    this._vec = new Vector();
    this._vec = _vec;

    int _size = _vec.size();
    int i ;

    for(i = 0; i <_size; i++)
    {   
        _headStr = new String();
        _metaStr = new String();
        _bmp = Bitmap.getBitmapResource("img/1.jpg");
        _bmF = new BitmapField(_bmp);

        _topNews = (TopNews)_vec.elementAt(i);
        _headStr = _topNews.getHeadline();
        _metaStr = _topNews.getMetaData();

        int _newsLeng = _headStr.length(), alert = 0;

        if(_newsLeng <= 35)
        {
            alert = 0;
        }else if(_newsLeng>35&&_newsLeng<=70)
        {
            alert = 1;
        }else {
            alert = 2;
            _headStr = this.truncate(_headStr,70);

        }
        _custRow = new CustomRow(alert);

        _headNews = new CustTextField(_headStr,25,0x05235b,TextField.NON_FOCUSABLE);
        _metaData = new CustTextField(_metaStr,15,0x666666,TextField.NON_FOCUSABLE);

        _custRow.add(_headNews);
        _custRow.add(_metaData);
        _custRow.add(_bmF);

        super.add(_custRow);


    }
}



String truncate(String value, int length)
{
      if (value != null && value.length() > length)
        value = value.substring(0, length);
      return value;
}
}

class CustomRow extends Manager implements FocusChangeListener{

private int  _headLeng;
private NullField _focus = null;

CustomRow(int _headLeng)
{
    super(Manager.FOCUSABLE|
            Manager.NO_HORIZONTAL_SCROLL
            |Manager.NO_VERTICAL_SCROLL);

    this._headLeng = _headLeng;
    _focus = new NullField(NullField.FOCUSABLE);
    _focus.setFocusListener(CustomRow.this);
    this.add(_focus);

}

protected void sublayout(int width, int height) 
{
    if(_headLeng==0)
    {
    layoutChild(getField(0),0,0);  
    setPositionChild(getField(0),0 , 0);

    layoutChild(getField(1),360,20);  
    setPositionChild(getField(1),10 , 10);

    layoutChild(getField(2),300, 20);
    setPositionChild(getField(2), 10, 65);

    layoutChild(getField(3),90,65);
    setPositionChild(getField(3), 380, 10);

    }else
    {
    /*  layoutChild(getField(0),0,0);  
        setPositionChild(getField(0),0 , 0);

        layoutChild(getField(1),360,20);  
        setPositionChild(getField(1),10 , 10);

        layoutChild(getField(2),300, 20);   
        setPositionChild(getField(2), 10, 50);

        layoutChild(getField(3),90,65);
        setPositionChild(getField(3), 380, 10);     */
        layoutChild(getField(0),0,0);  
        setPositionChild(getField(0),0 , 0);

        layoutChild(getField(1),360,20);  
        setPositionChild(getField(1),10 , 10);

        layoutChild(getField(2),300, 20);
        setPositionChild(getField(2), 10, 65);

        layoutChild(getField(3),90,65);
        setPositionChild(getField(3), 380, 10);

    }

    height = 80;
    width = 480;  
    setExtent(width, height);
}
protected void paint(Graphics graphics)
{
    graphics.setColor(Color.GRAY);
    graphics.drawLine(10, 79, Display.getWidth()-10, 79);
    super.paint(graphics);
}

public void focusChanged(Field field, int eventType) {
    // TODO Auto-generated method stub
    this.getManager().invalidate();
}



protected void paintBackground(Graphics g) {
      int prevBg = g.getBackgroundColor();
      if (_focus.isFocus()) {
        g.setBackgroundColor(Color.LIGHTBLUE);
      } else {
        g.setBackgroundColor(Color.WHITE);
      }
      g.clear();
      g.setBackgroundColor(prevBg);
    }
}

1 个答案:

答案 0 :(得分:-1)

以下链接有问题的答案,我应该将名称更改为Blackberry lazyloading。

http://supportforums.blackberry.com/t5/Java-Development/Clumsy-layout-invalidate/m-p/1398763