黑莓 - Listfield 布局问题

发布于 2024-08-31 06:45:12 字数 2543 浏览 8 评论 0 原文

在黑莓模拟器上显示列表字段时,我遇到了一个有趣的异常情况:

顶部项目是单行文本的高度(大约 12 像素),而其余项目都很好。 有谁知道为什么只有顶部的项目是这样绘制的?另外,当我在位置 0 添加一个空场地时,它仍然以这种方式显示第一个实际场地(位置 1 中的项目)。

不知道该怎么办。 感谢您的任何帮助。

布局看起来像这样:

-----------------------------------
| *part of image* | title         |
-----------------------------------
|                 | title         |
| * full image *  | address       |
|                 | city, zip     |
-----------------------------------

对象的调用方式如下:

listField = new ListField( venueList.size() );
listField.setCallback( this );
listField.setSelectedIndex(-1);
_middle.add( listField );

这是drawListRow 代码:

public void drawListRow( ListField listField, Graphics graphics, 
    int index, int y, int width ) 
{

    listField.setRowHeight(90);
    Hashtable item = (Hashtable) venueList.elementAt( index );
    String venue_name = (String) item.get("name");
    String image_url = (String) item.get("image_url");
    String address = (String) item.get("address");
    String city = (String) item.get("city");
    String zip = (String) item.get("zip");
    EncodedImage img = null;

try 
    {
        String filename = image_url.substring(image_url.indexOf("crop/") 
            + 5, image_url.length() );
        FileConnection fconn = (FileConnection)Connector.open( 
            "file:///SDCard/Blackberry/project1/" + filename, 
            Connector.READ);            
        if ( !fconn.exists() )
        {

        }
        else
        {
            InputStream input = fconn.openInputStream();

            byte[] data = new byte[(int)fconn.fileSize()];
            input.read(data);
            input.close();
            if(data.length > 0)
            {
                EncodedImage rawimg = EncodedImage.createEncodedImage(
                    data, 0, data.length);                  
                int dw = Fixed32.toFP(Display.getWidth());
                int iw = Fixed32.toFP(rawimg.getWidth());
                int sf = Fixed32.div(iw, dw);
                img = rawimg.scaleImage32(sf * 4, sf * 4);
            }
            else
            {

            }
        }
}
catch(IOException ef)
{                

} 

   graphics.drawText( venue_name, 140, y, 0, width );
   graphics.drawText( address, 140, y + 15, 0, width );
   graphics.drawText( city + ", " + zip, 140, y + 30, 0, width );
   if(img != null)
   {
       graphics.drawImage(0, y, img.getWidth(), img.getHeight(), 
           img, 0, 0, 0);
   }    
}

I'm having an interesting anomaly when displaying a listfield on the blackberry simulator:

The top item is the height of a single line of text (about 12 pixels) while the rest are fine.
Does anyone know why only the top item is being drawn this way? Also, when I add an empty venue in position 0, it still displays the first actual venue this way (item in position 1).

Not sure what to do.
Thanks for any help.

The layout looks like this:

-----------------------------------
| *part of image* | title         |
-----------------------------------
|                 | title         |
| * full image *  | address       |
|                 | city, zip     |
-----------------------------------

The object is called like so:

listField = new ListField( venueList.size() );
listField.setCallback( this );
listField.setSelectedIndex(-1);
_middle.add( listField );

Here is the drawListRow code:

public void drawListRow( ListField listField, Graphics graphics, 
    int index, int y, int width ) 
{

    listField.setRowHeight(90);
    Hashtable item = (Hashtable) venueList.elementAt( index );
    String venue_name = (String) item.get("name");
    String image_url = (String) item.get("image_url");
    String address = (String) item.get("address");
    String city = (String) item.get("city");
    String zip = (String) item.get("zip");
    EncodedImage img = null;

try 
    {
        String filename = image_url.substring(image_url.indexOf("crop/") 
            + 5, image_url.length() );
        FileConnection fconn = (FileConnection)Connector.open( 
            "file:///SDCard/Blackberry/project1/" + filename, 
            Connector.READ);            
        if ( !fconn.exists() )
        {

        }
        else
        {
            InputStream input = fconn.openInputStream();

            byte[] data = new byte[(int)fconn.fileSize()];
            input.read(data);
            input.close();
            if(data.length > 0)
            {
                EncodedImage rawimg = EncodedImage.createEncodedImage(
                    data, 0, data.length);                  
                int dw = Fixed32.toFP(Display.getWidth());
                int iw = Fixed32.toFP(rawimg.getWidth());
                int sf = Fixed32.div(iw, dw);
                img = rawimg.scaleImage32(sf * 4, sf * 4);
            }
            else
            {

            }
        }
}
catch(IOException ef)
{                

} 

   graphics.drawText( venue_name, 140, y, 0, width );
   graphics.drawText( address, 140, y + 15, 0, width );
   graphics.drawText( city + ", " + zip, 140, y + 30, 0, width );
   if(img != null)
   {
       graphics.drawImage(0, y, img.getWidth(), img.getHeight(), 
           img, 0, 0, 0);
   }    
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

墨洒年华 2024-09-07 06:45:12

setRowHeight 应在构建 ListField,不在 drawListRow

listField = new ListField( venueList.size() );
listField.setRowHeight(90);
listField.setCallback( this );
listField.setSelectedIndex(-1);
_middle.add( listField );

setRowHeight should be called once after construction of ListField, not inside of drawListRow on each time row is repainted:

listField = new ListField( venueList.size() );
listField.setRowHeight(90);
listField.setCallback( this );
listField.setSelectedIndex(-1);
_middle.add( listField );
我是有多爱你 2024-09-07 06:45:12

阿曼,
希望你能用它来做点什么。您应该能够从这个完全失控的类中提取列表字段数据。请记住,这是一项正在进行的工作,因此您必须删除对我的应用程序来说非常明显自定义的内容。就像依赖文件名子字符串的图像处理一样。
它对我来说效果很好,但对任何人来说完全不起作用,因为只是复制和粘贴,所以祝你好运......

 package venue;

import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

import javax.microedition.io.Connector;
import javax.microedition.io.file.FileConnection;

import net.rim.device.api.math.Fixed32;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.Display;
import net.rim.device.api.system.EncodedImage;
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FieldChangeListener;
import net.rim.device.api.ui.FocusChangeListener;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.MenuItem;
import net.rim.device.api.ui.Screen;
import net.rim.device.api.ui.Ui;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.BitmapField;
import net.rim.device.api.ui.component.Dialog;
import net.rim.device.api.ui.component.ListField;
import net.rim.device.api.ui.component.ListFieldCallback;
import net.rim.device.api.ui.component.Menu;
import net.rim.device.api.ui.component.RichTextField;
import net.rim.device.api.ui.component.SeparatorField;
import net.rim.device.api.ui.container.HorizontalFieldManager;
import net.rim.device.api.ui.container.MainScreen;
import net.rim.device.api.ui.container.VerticalFieldManager;

public class categoryView extends MainScreen implements FieldChangeListener, ListFieldCallback, FocusChangeListener  {

    private HorizontalFieldManager _top;
    private HorizontalFieldManager _nav;
    private VerticalFieldManager _middle;
    private int horizontalOffset;
    private final static long animationTime = 300;
    private long animationStart = 0;
    private int venue_id;
    private int category_id;
    private CustomButtonField rectangle;
    private Vector venueList = new Vector();
    private Hashtable venue_index = new Hashtable();
    private Vector image_index = new Vector();
    private ListField listField;
    private int last_menu_item = 2;
    private int last_nav = 2;
    private int before_last = 1;
    private int location_count = 0;
    private int img_width = 120;
    private int img_height = 80;
    private Field f;

    public categoryView(int id) {
        super();

        category_id = id;

        horizontalOffset = Display.getWidth();

        _top = new HorizontalFieldManager(Manager.USE_ALL_WIDTH | Field.FIELD_HCENTER)
        {
            public void paint(Graphics gr)
            {
                Bitmap bg = Bitmap.getBitmapResource("bg.png");
                gr.drawBitmap(0, 0, Display.getWidth(), Display.getHeight(), bg, 0, 0);
                subpaint(gr);
            }           
        };
        _nav = new HorizontalFieldManager(Field.USE_ALL_WIDTH);
        _middle = new VerticalFieldManager();

        add(_top);
        add(_nav);
        add(_middle);

        Bitmap lol = Bitmap.getBitmapResource("logo.png");
        BitmapField lolfield = new BitmapField(lol);
        _top.add(lolfield);

        HorizontalFieldManager nav = new HorizontalFieldManager(Field.USE_ALL_WIDTH | Manager.HORIZONTAL_SCROLL);

        Vector locs = getLocations();
        Hashtable locations = (Hashtable) locs.elementAt(0);
        Enumeration ne  = locations.keys();
        Enumeration nv = locations.elements();

        int counter = 1;
        if(locations.size() > 1)
        {
            counter = locations.size() - 1;
        }

        int count = 1;
        while(ne.hasMoreElements())
        {
            final String location_id = ne.nextElement().toString();
            String location = nv.nextElement().toString();
            last_nav = Integer.parseInt(location_id);

            rectangle = new CustomButtonField(location_id, location, 25, Field.FOCUSABLE);
            rectangle.setFocusListener(this);
            nav.add(rectangle);

            if(count == counter)
            {
                before_last = Integer.parseInt(location_id);
            }
            count ++;
        }   

        _nav.add(nav);

    }

    public void setDefaultLocation()
    {
        Vector locs = getLocations();
        Hashtable loc1 = (Hashtable) locs.elementAt(0);
        Enumeration er  = loc1.keys();
        Enumeration vr = loc1.elements();

        int i = 0;
        while(er.hasMoreElements())
        {
            final String location_id = er.nextElement().toString();

            if(i == 0)
            {
                last_menu_item = Integer.parseInt(location_id);
            }
            i ++;
        }

    }

    public void drawMiddle()
    {
        Vector venues = getVenues(category_id);
        Hashtable venue_list = (Hashtable) venues.elementAt(0);
        Enumeration e  = venue_list.keys();
        Enumeration v = venue_list.elements();

        int count = 0;
        while(e.hasMoreElements())
        {

            String vid = e.nextElement().toString();
            Hashtable elm = (Hashtable)v.nextElement();
            venueList.addElement(elm);
            venue_index.put(Integer.toString(count), (String) elm.get("venue_id"));

            EncodedImage img = null;
            String image_url = (String) elm.get("image_url");
            try 
            {
                String filename;
                    if(image_url.length() > 5)
                    {
                        filename = image_url.substring( image_url.indexOf("crop/") + 5, image_url.length() );
                    }
                    else
                    {
                        filename = "1.png";
                    }
                    FileConnection fconn = (FileConnection) Connector.open( "file:///SDCard/Blackberry/venue/" + filename, Connector.READ);

                    if ( !fconn.exists() )
                    {

                    }
                    else
                    {
                        InputStream input = fconn.openInputStream();

                        byte[] data = new byte[(int)fconn.fileSize()];
                        input.read(data);
                        input.close();
                        if(data.length > 0)
                        {
                            EncodedImage rawimg = EncodedImage.createEncodedImage(data, 0, data.length);

                            int dw = Fixed32.toFP(Display.getWidth());
                            int iw = Fixed32.toFP(rawimg.getWidth());
                            int sf = Fixed32.div(iw, dw);
                            img = rawimg.scaleImage32(sf * 4, sf * 4);
                            img_width = (int) Math.ceil(Display.getWidth() / 4);
                            img_height = (int) Math.ceil(Display.getWidth() / 6);
                        }
                        else
                        {

                        }
                    }
            }
            catch(IOException ef)
            {                

            } 

            image_index.addElement(img);

            count ++;
        }
        final int count_results = count;

        _middle = new VerticalFieldManager( Manager.VERTICAL_SCROLLBAR )
        {
            public void paint(Graphics graphics)
            {
                graphics.setBackgroundColor(0xFFFFFF);
                graphics.setColor(Color.BLACK);
                graphics.clear();
                super.paint(graphics);

            }
            protected void sublayout(int maxWidth, int maxHeight)
            {
                int displayWidth = Display.getWidth();
                //int displayHeight = Display.getHeight();
                int displayHeight = count_results * img_height;

                super.sublayout( displayWidth, displayHeight);
                setExtent( displayWidth, displayHeight);
            }

        };
        add(_middle);

        listField = new ListField( venueList.size() );
        listField.setCallback( this );
        listField.setSelectedIndex(-1);
        listField.setRowHeight(img_height);
        _middle.add( listField );

        _middle.add(new RichTextField(Field.NON_FOCUSABLE));
    }

    public boolean navigationClick(int status, int time) {

        Field focus = UiApplication.getUiApplication().getActiveScreen() .getLeafFieldWithFocus();

             if (focus instanceof ListField) {
                 int selected = listField.getSelectedIndex();
                 String venue_id = (String) venue_index.get(Integer.toString(selected));
                 moveScreens(venue_id);

        }
             return true;

 }

    void setListSize() 
    {
        listField.setSize( venueList.size() );
    }

    public void drawListRow( ListField listField, Graphics graphics, int index, int y, int width ) 
    {
        Hashtable item = (Hashtable) venueList.elementAt( index );

        String venue_name = (String) item.get("name");
        String address = (String) item.get("address");
        String city = (String) item.get("city");
        String zip = (String) item.get("zip");

        EncodedImage img = (EncodedImage) image_index.elementAt(index);

       graphics.drawText( venue_name, img_width + 10, y, 0, width );
       graphics.drawText( address, img_width + 10, y + 15, 0, width );
       graphics.drawText( city + ", " + zip, img_width + 10, y + 30, 0, width );
       if(img != null)
       {
           graphics.drawImage(0, y + 3, img.getWidth(), img.getHeight(), img, 0, 0, 0);
       }


    }

    public Object get( ListField listField, int index ) 
    {
        return venueList.elementAt( index );
    }

    public Vector getCategories()
    {
        Vector results = new Vector();

        database db = new database();
        Vector categories = db.getCategories();
        if(categories.size() > 0)
            results = categories;

        return results;
    }

    public Vector getLocations()
    {
        Vector results = new Vector();

        database db = new database();
        Vector subcats = db.getCategoryLocations(category_id);
        Hashtable subs = (Hashtable) subcats.elementAt(0);
        if(subs.size() > 0)
        {
            location_count = subs.size();
            results = subcats;
        }

        return results;
    }

    public Vector getVenues(int category_id)
    {
        Vector results = new Vector();

        database db = new database();
        Vector venues = db.getLocationVenues(category_id, last_menu_item);
        if(venues.size() > 0)
            results = venues;

        return results;
    }

    protected void makeMenu(Menu menu, int instance)
    {
        super.makeMenu(menu, instance);
        menu.add(new MenuItem("Home", 10, 20){
            public void run()
            {
                moveScreens("main");
            }
        });
        menu.add(new MenuItem("Search", 10, 20){
            public void run()
            {
                Dialog.inform("Search was clicked.");
            }
        });

        Vector locs = getLocations();
        Hashtable locations = (Hashtable) locs.elementAt(0);
        Enumeration e  = locations.keys();
        Enumeration v = locations.elements();

        while(e.hasMoreElements())
        {
            final String location_id = e.nextElement().toString();
            String location = v.nextElement().toString();

            menu.add(new MenuItem(location, 10, 20){
                public void run()
                {
                    Dialog.inform("Location " + location_id + " was clicked");
                }
            });
        }


    }

    public void moveScreens(String type)
    {
        if(type == "main")
        {
            UiApplication.getUiApplication().popScreen(this);
        }
        else
        {
            int venue_id = Integer.parseInt(type);

            Screen newScreen = new ViewVenue(venue_id);
            UiApplication.getUiApplication().pushScreen(newScreen);
        }
    }

    protected void sublayout(int width, int height)
    {
        super.sublayout(width, height);

        if(horizontalOffset > 0)
        {
            if(animationStart == 0)
            {
                animationStart = System.currentTimeMillis();
            }
            else
            {
                long timeElapsed = System.currentTimeMillis() - animationStart;
                if(timeElapsed >= animationTime)
                {
                    horizontalOffset = 0;
                }
                else
                {
                    float percentDone = (float)timeElapsed / (float)animationTime;
                    horizontalOffset = Display.getWidth() - (int)(percentDone * Display.getWidth());
                }
            }
        }
        setPosition(horizontalOffset, 0);

        if(horizontalOffset > 0)
        {
            UiApplication.getUiApplication().invokeLater(new Runnable(){
                public void run()
                {
                    updateLayout();
                }
            });
        }
    }

    public void fieldChanged(Field field, int context) 
    {

        int id = 0;

        if (field instanceof CustomButtonField) {
           id = ((CustomButtonField)field).getId();
        }        

        venue_id = id;
        Dialog.inform(Integer.toString(venue_id));
        //moveScreens("venue");

    }

    public void focusChanged(Field field, int eventType) {

        if((eventType == FocusChangeListener.FOCUS_GAINED)) {

            if (field instanceof CustomButtonField) {
              final int id = ((CustomButtonField)field).getId();

              if(id == last_nav && before_last != last_menu_item && last_nav != before_last)
              {
                  //updateContent(id);
                  f.setFocus();
              }
              else
              {
                  updateContent(id);
                  f = field;
              }



           } 
        }
    }

    public void updateContent(final int id)
    {
        UiApplication.getUiApplication().invokeLater(new Runnable(){
            public void run()
            {   
                delete(_middle);
                venueList.removeAllElements();
                image_index.removeAllElements();
                last_menu_item = id;

                drawMiddle();
            }
        });
    }

    public boolean onSavePrompt()
    {
        // do nothing
        return true;
    }

    public int getPreferredWidth(ListField listField) {
        // TODO Auto-generated method stub
        return 0;
    }

    public int indexOfList(ListField listField, String prefix, int start) {
        // TODO Auto-generated method stub
        return 0;
    }
}

Aman,
Hopefully you can use this for something. You should be able to extract the list field data from this wildly out of control class. Remember, this is a work in progress, so you will have to strip out the things that are quite clearly custom to my app. Like the image handling that relies on a substring for a file name.
It works fine for me, but it will totally not work for anyone htat just copies and pastes, so good luck...

 package venue;

import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

import javax.microedition.io.Connector;
import javax.microedition.io.file.FileConnection;

import net.rim.device.api.math.Fixed32;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.Display;
import net.rim.device.api.system.EncodedImage;
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FieldChangeListener;
import net.rim.device.api.ui.FocusChangeListener;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.MenuItem;
import net.rim.device.api.ui.Screen;
import net.rim.device.api.ui.Ui;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.BitmapField;
import net.rim.device.api.ui.component.Dialog;
import net.rim.device.api.ui.component.ListField;
import net.rim.device.api.ui.component.ListFieldCallback;
import net.rim.device.api.ui.component.Menu;
import net.rim.device.api.ui.component.RichTextField;
import net.rim.device.api.ui.component.SeparatorField;
import net.rim.device.api.ui.container.HorizontalFieldManager;
import net.rim.device.api.ui.container.MainScreen;
import net.rim.device.api.ui.container.VerticalFieldManager;

public class categoryView extends MainScreen implements FieldChangeListener, ListFieldCallback, FocusChangeListener  {

    private HorizontalFieldManager _top;
    private HorizontalFieldManager _nav;
    private VerticalFieldManager _middle;
    private int horizontalOffset;
    private final static long animationTime = 300;
    private long animationStart = 0;
    private int venue_id;
    private int category_id;
    private CustomButtonField rectangle;
    private Vector venueList = new Vector();
    private Hashtable venue_index = new Hashtable();
    private Vector image_index = new Vector();
    private ListField listField;
    private int last_menu_item = 2;
    private int last_nav = 2;
    private int before_last = 1;
    private int location_count = 0;
    private int img_width = 120;
    private int img_height = 80;
    private Field f;

    public categoryView(int id) {
        super();

        category_id = id;

        horizontalOffset = Display.getWidth();

        _top = new HorizontalFieldManager(Manager.USE_ALL_WIDTH | Field.FIELD_HCENTER)
        {
            public void paint(Graphics gr)
            {
                Bitmap bg = Bitmap.getBitmapResource("bg.png");
                gr.drawBitmap(0, 0, Display.getWidth(), Display.getHeight(), bg, 0, 0);
                subpaint(gr);
            }           
        };
        _nav = new HorizontalFieldManager(Field.USE_ALL_WIDTH);
        _middle = new VerticalFieldManager();

        add(_top);
        add(_nav);
        add(_middle);

        Bitmap lol = Bitmap.getBitmapResource("logo.png");
        BitmapField lolfield = new BitmapField(lol);
        _top.add(lolfield);

        HorizontalFieldManager nav = new HorizontalFieldManager(Field.USE_ALL_WIDTH | Manager.HORIZONTAL_SCROLL);

        Vector locs = getLocations();
        Hashtable locations = (Hashtable) locs.elementAt(0);
        Enumeration ne  = locations.keys();
        Enumeration nv = locations.elements();

        int counter = 1;
        if(locations.size() > 1)
        {
            counter = locations.size() - 1;
        }

        int count = 1;
        while(ne.hasMoreElements())
        {
            final String location_id = ne.nextElement().toString();
            String location = nv.nextElement().toString();
            last_nav = Integer.parseInt(location_id);

            rectangle = new CustomButtonField(location_id, location, 25, Field.FOCUSABLE);
            rectangle.setFocusListener(this);
            nav.add(rectangle);

            if(count == counter)
            {
                before_last = Integer.parseInt(location_id);
            }
            count ++;
        }   

        _nav.add(nav);

    }

    public void setDefaultLocation()
    {
        Vector locs = getLocations();
        Hashtable loc1 = (Hashtable) locs.elementAt(0);
        Enumeration er  = loc1.keys();
        Enumeration vr = loc1.elements();

        int i = 0;
        while(er.hasMoreElements())
        {
            final String location_id = er.nextElement().toString();

            if(i == 0)
            {
                last_menu_item = Integer.parseInt(location_id);
            }
            i ++;
        }

    }

    public void drawMiddle()
    {
        Vector venues = getVenues(category_id);
        Hashtable venue_list = (Hashtable) venues.elementAt(0);
        Enumeration e  = venue_list.keys();
        Enumeration v = venue_list.elements();

        int count = 0;
        while(e.hasMoreElements())
        {

            String vid = e.nextElement().toString();
            Hashtable elm = (Hashtable)v.nextElement();
            venueList.addElement(elm);
            venue_index.put(Integer.toString(count), (String) elm.get("venue_id"));

            EncodedImage img = null;
            String image_url = (String) elm.get("image_url");
            try 
            {
                String filename;
                    if(image_url.length() > 5)
                    {
                        filename = image_url.substring( image_url.indexOf("crop/") + 5, image_url.length() );
                    }
                    else
                    {
                        filename = "1.png";
                    }
                    FileConnection fconn = (FileConnection) Connector.open( "file:///SDCard/Blackberry/venue/" + filename, Connector.READ);

                    if ( !fconn.exists() )
                    {

                    }
                    else
                    {
                        InputStream input = fconn.openInputStream();

                        byte[] data = new byte[(int)fconn.fileSize()];
                        input.read(data);
                        input.close();
                        if(data.length > 0)
                        {
                            EncodedImage rawimg = EncodedImage.createEncodedImage(data, 0, data.length);

                            int dw = Fixed32.toFP(Display.getWidth());
                            int iw = Fixed32.toFP(rawimg.getWidth());
                            int sf = Fixed32.div(iw, dw);
                            img = rawimg.scaleImage32(sf * 4, sf * 4);
                            img_width = (int) Math.ceil(Display.getWidth() / 4);
                            img_height = (int) Math.ceil(Display.getWidth() / 6);
                        }
                        else
                        {

                        }
                    }
            }
            catch(IOException ef)
            {                

            } 

            image_index.addElement(img);

            count ++;
        }
        final int count_results = count;

        _middle = new VerticalFieldManager( Manager.VERTICAL_SCROLLBAR )
        {
            public void paint(Graphics graphics)
            {
                graphics.setBackgroundColor(0xFFFFFF);
                graphics.setColor(Color.BLACK);
                graphics.clear();
                super.paint(graphics);

            }
            protected void sublayout(int maxWidth, int maxHeight)
            {
                int displayWidth = Display.getWidth();
                //int displayHeight = Display.getHeight();
                int displayHeight = count_results * img_height;

                super.sublayout( displayWidth, displayHeight);
                setExtent( displayWidth, displayHeight);
            }

        };
        add(_middle);

        listField = new ListField( venueList.size() );
        listField.setCallback( this );
        listField.setSelectedIndex(-1);
        listField.setRowHeight(img_height);
        _middle.add( listField );

        _middle.add(new RichTextField(Field.NON_FOCUSABLE));
    }

    public boolean navigationClick(int status, int time) {

        Field focus = UiApplication.getUiApplication().getActiveScreen() .getLeafFieldWithFocus();

             if (focus instanceof ListField) {
                 int selected = listField.getSelectedIndex();
                 String venue_id = (String) venue_index.get(Integer.toString(selected));
                 moveScreens(venue_id);

        }
             return true;

 }

    void setListSize() 
    {
        listField.setSize( venueList.size() );
    }

    public void drawListRow( ListField listField, Graphics graphics, int index, int y, int width ) 
    {
        Hashtable item = (Hashtable) venueList.elementAt( index );

        String venue_name = (String) item.get("name");
        String address = (String) item.get("address");
        String city = (String) item.get("city");
        String zip = (String) item.get("zip");

        EncodedImage img = (EncodedImage) image_index.elementAt(index);

       graphics.drawText( venue_name, img_width + 10, y, 0, width );
       graphics.drawText( address, img_width + 10, y + 15, 0, width );
       graphics.drawText( city + ", " + zip, img_width + 10, y + 30, 0, width );
       if(img != null)
       {
           graphics.drawImage(0, y + 3, img.getWidth(), img.getHeight(), img, 0, 0, 0);
       }


    }

    public Object get( ListField listField, int index ) 
    {
        return venueList.elementAt( index );
    }

    public Vector getCategories()
    {
        Vector results = new Vector();

        database db = new database();
        Vector categories = db.getCategories();
        if(categories.size() > 0)
            results = categories;

        return results;
    }

    public Vector getLocations()
    {
        Vector results = new Vector();

        database db = new database();
        Vector subcats = db.getCategoryLocations(category_id);
        Hashtable subs = (Hashtable) subcats.elementAt(0);
        if(subs.size() > 0)
        {
            location_count = subs.size();
            results = subcats;
        }

        return results;
    }

    public Vector getVenues(int category_id)
    {
        Vector results = new Vector();

        database db = new database();
        Vector venues = db.getLocationVenues(category_id, last_menu_item);
        if(venues.size() > 0)
            results = venues;

        return results;
    }

    protected void makeMenu(Menu menu, int instance)
    {
        super.makeMenu(menu, instance);
        menu.add(new MenuItem("Home", 10, 20){
            public void run()
            {
                moveScreens("main");
            }
        });
        menu.add(new MenuItem("Search", 10, 20){
            public void run()
            {
                Dialog.inform("Search was clicked.");
            }
        });

        Vector locs = getLocations();
        Hashtable locations = (Hashtable) locs.elementAt(0);
        Enumeration e  = locations.keys();
        Enumeration v = locations.elements();

        while(e.hasMoreElements())
        {
            final String location_id = e.nextElement().toString();
            String location = v.nextElement().toString();

            menu.add(new MenuItem(location, 10, 20){
                public void run()
                {
                    Dialog.inform("Location " + location_id + " was clicked");
                }
            });
        }


    }

    public void moveScreens(String type)
    {
        if(type == "main")
        {
            UiApplication.getUiApplication().popScreen(this);
        }
        else
        {
            int venue_id = Integer.parseInt(type);

            Screen newScreen = new ViewVenue(venue_id);
            UiApplication.getUiApplication().pushScreen(newScreen);
        }
    }

    protected void sublayout(int width, int height)
    {
        super.sublayout(width, height);

        if(horizontalOffset > 0)
        {
            if(animationStart == 0)
            {
                animationStart = System.currentTimeMillis();
            }
            else
            {
                long timeElapsed = System.currentTimeMillis() - animationStart;
                if(timeElapsed >= animationTime)
                {
                    horizontalOffset = 0;
                }
                else
                {
                    float percentDone = (float)timeElapsed / (float)animationTime;
                    horizontalOffset = Display.getWidth() - (int)(percentDone * Display.getWidth());
                }
            }
        }
        setPosition(horizontalOffset, 0);

        if(horizontalOffset > 0)
        {
            UiApplication.getUiApplication().invokeLater(new Runnable(){
                public void run()
                {
                    updateLayout();
                }
            });
        }
    }

    public void fieldChanged(Field field, int context) 
    {

        int id = 0;

        if (field instanceof CustomButtonField) {
           id = ((CustomButtonField)field).getId();
        }        

        venue_id = id;
        Dialog.inform(Integer.toString(venue_id));
        //moveScreens("venue");

    }

    public void focusChanged(Field field, int eventType) {

        if((eventType == FocusChangeListener.FOCUS_GAINED)) {

            if (field instanceof CustomButtonField) {
              final int id = ((CustomButtonField)field).getId();

              if(id == last_nav && before_last != last_menu_item && last_nav != before_last)
              {
                  //updateContent(id);
                  f.setFocus();
              }
              else
              {
                  updateContent(id);
                  f = field;
              }



           } 
        }
    }

    public void updateContent(final int id)
    {
        UiApplication.getUiApplication().invokeLater(new Runnable(){
            public void run()
            {   
                delete(_middle);
                venueList.removeAllElements();
                image_index.removeAllElements();
                last_menu_item = id;

                drawMiddle();
            }
        });
    }

    public boolean onSavePrompt()
    {
        // do nothing
        return true;
    }

    public int getPreferredWidth(ListField listField) {
        // TODO Auto-generated method stub
        return 0;
    }

    public int indexOfList(ListField listField, String prefix, int start) {
        // TODO Auto-generated method stub
        return 0;
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文