第二行未显示在ListField中(文本换行未发生)...请咨询

时间:2010-02-16 03:29:52

标签: blackberry email listfield

以下是示例代码:

class MailBoxSampleListField extends MainScreen implements FolderListener, StoreListener {
private static final int COLUMN_WIDTH_STATUS = 10;
private static final int COLUMN_WIDTH_DATE = 150;
private static final int COLUMN_WIDTH_NAME = 150;

public ListField myList; 
private ListCallback myCallback;
public Vector sampleList = new Vector();
public Vector sampleVector;

    private class ListCallback implements ListFieldCallback {
    public Vector myVector = new Vector();
    public Bitmap LIST_IMAGE = Bitmap.getBitmapResource("New.PNG");
    public void drawListRow (ListField list, Graphics g, int index, int y,int w) {
        displayList(g,0,y,w,(( Message )myVector.elementAt( index )), LIST_IMAGE); // for drawing the list row
        for( int ii = 0; ii < sampleVector.size(); ii++) {
            String text = ( String )sampleVector.elementAt(ii);
            int liney = y + ( ii * list.getFont().getHeight() );
            g.drawText( text, LIST_IMAGE.getWidth() + 5, liney, Graphics.ELLIPSIS, w );
        }
    }

    public Object get( ListField list, int index ) {
        return myVector.elementAt(index); 
    }

    public int indexOfList( ListField list,String p, int s ) {
        return myVector.indexOf(p,s);
    }

    public int getPreferredWidth ( ListField list ) {
        return Graphics.getScreenWidth();
    }

    public void insert(Message _message, int index) {
        myVector.addElement(_message);
    }

    public void erase () {
        myVector.removeAllElements();
    }
}

MailBoxSampleListField() {

    ListCallback myCallback = new ListCallback(); 

    try {
        Store store = null;
        store = Session.getDefaultInstance().getStore();
        store.addStoreListener( this );

        // retrieve Folder object fow which we want to receive message notification
        try {
            Folder[] folders = store.list();
            Folder[] f1 = store.findFolder( "inbox" );
            Folder vinbox = f1[0];
            for (int i =0; i < f1.length; i++) {
                f1[i].addFolderListener( this );
            }

            Message[] vmessages = vinbox.getMessages();
            for ( int j = 0; j < vmessages.length; ++j ) {
                if(vmessages[j] != null){
                    sampleList.addElement( vmessages[j] );
                }
            }
            myList = new ListField(); // initialize the ListField
            for ( int k = 0; k < sampleList.size(); k++ ) {
                myList.insert(k);
                myCallback.insert(vmessages[k], k);   
            }

            myList.setCallback( myCallback );
            add( myList );     
        }
        catch( Exception e ){
        }
    }
    catch ( Exception se ) {
    }
}

public void displayList( Graphics g, int x, int y, int width, Message _message, Bitmap LIST_IMAGE ) {
    g.drawBitmap(0, y, LIST_IMAGE.getWidth(), LIST_IMAGE.getHeight(), LIST_IMAGE, 0, 0);
    sampleVector = new Vector();
    Date d = _message.getReceivedDate();
    Calendar c = Calendar.getInstance();
    c.setTime(d);
    StringBuffer sb = new StringBuffer();
    sb.append( c.get( Calendar.MONTH ) );
    sb.append('-');
    int digit = c.get( Calendar.DAY_OF_MONTH );
    if ( digit < 10 ) sb.append(0);
    sb.append( digit );
    sb.append(' ');
    sb.append( c.get( Calendar.HOUR_OF_DAY ) );
    sb.append(':');
    digit = c.get( Calendar.MINUTE );
    if ( digit < 10 ) sb.append( 0 );
    sb.append( digit );
    sb.append( ' ');

    x += LIST_IMAGE.getWidth()+5; 
    x += COLUMN_WIDTH_DATE;

    try {
        String name = "<noname>";
        if ( _message.isInbound() ) {
            Address a = _message.getFrom();
            if ( a != null )
            {
                name = a.getName();
                if ( name == null || name.length() == 0 ) name = a.getAddr();
            }
        }
        else
        {
            //get the first Recipient address
            Address[] set = _message.getRecipients(Message.RecipientType.TO);
            if ( set != null && set.length > 0 ) 
            {
                name = set[0].getName();
                if ( name == null || name.length() == 0 ) name = set[0].getAddr();
            }
        }           
       sampleVector.addElement(name +"   " + sb.toString());
        } catch (MessagingException e) {
        System.err.println(e);
    } 

    x += COLUMN_WIDTH_NAME;
    int remainingColumnWidth = Graphics.getScreenWidth() - x;

    //get the subject, or if that doesn't exist, the first line of the body
    String textToDisplay = _message.getSubject();
    if ( null == textToDisplay) //no subject! get the first line of the body if present
    {
        Object o = _message.getContent();
        if ( o instanceof String )
        {
            textToDisplay = (String)o;
        }
        else if ( o instanceof Multipart )
        { 
            Multipart mp = (Multipart)o;
            int count = mp.getCount();
            for (int i = 0; i < count; ++i)
            {
                BodyPart p = mp.getBodyPart(i);
                if ( p instanceof TextBodyPart )
                {
                    textToDisplay = (String)p.getContent();
                }
            }
        }
    }
            sampleVector.addElement(textToDisplay);
    } public void messagesAdded(FolderEvent e) {} public void messagesRemoved(FolderEvent e) { } public void batchOperation( StoreEvent se) { }

}

4 个答案:

答案 0 :(得分:0)

我不确定你的意思,请你发布截图,以便我们看到问题?

我会尽力帮助我。在我有限的经验中,我注意到在listfield中,如果你没有将行高(setRowHeight())设置为足够大的高度,那么溢出该行大小的图形(包括文本)将不会显示。您是否尝试将行高设置为2 * list.getFont().getHeight()或更高?

答案 1 :(得分:0)

如果没有显示所有行,那么我认为你错过了调用 myList.setSize(myVector.size());

我不确定你的意思是“包装不发生”......

将重复调用drawListRow()(由我上面建议的setSize()设置的次数。)

在你当前的代码中,你在每个drawListRow()调用中遍历整个myVector - 这是错误的。

答案 2 :(得分:0)

您必须使用在drawListRow中声明的值y(ListField list,Graphics g,int index, int y ,int w)

喜欢

g.drawText(text,LIST_IMAGE.getWidth()+ 5,y+liney,Graphics.ELLIPSIS,w)

我长期面对这个问题终于得到了解决方案。

答案 3 :(得分:0)

正如亚历克斯所说,你需要实现自己的包装类,看起来像:

    TextWrapper theWrapper = new TextWrapper();

    String[] wrappedText = theWrapper.textWrap(longText, wrappingWidth , 2);

    //
    // now draw text line by line
    //
    g.drawText(wrappedText[0], x, y, DrawStyle.LEFT, width);
    if (wrappedText.length > 1) {
        g.drawText(wrappedText[1], x, y + textFont.getHeight(), DrawStyle.LEFT | DrawStyle.ELLIPSIS, width);
    }

,其中

public class TextWrapper {

    ... // put here methods used by textWrap method

    //
    // textWrap splits input String in lines having width as maxWidth
    //
    public String[] textWrap(String s, int maxWidth, int maxLines)
    {
        String[] result;

        ... // do here the wrap job on input string s

        return result;
    }     
}