0

我正在开发 BB OS v5.0。我设法让列表出现在屏幕上。我正在从 web 服务获取数据并将其添加到Vector.

现在我想找出onclick,它是被点击的项目并相应地执行一些操作。为此,我正在尝试显示警报。但我没有收到警报。

这是我的代码:

在我的主屏幕中,我添加fieldmanager=new VerticalFieldManager();add(fieldmanager);

void fetchAlbumsForLetter(String letter) {
    Status.show("Processing ....", 3000);
    fieldManager.deleteAll();

    VerticalFieldManager top = new VerticalFieldManager(Manager.NO_HORIZONTAL_SCROLL | Manager.NO_HORIZONTAL_SCROLLBAR | Manager.VERTICAL_SCROLL | Manager.VERTICAL_SCROLLBAR | Field.USE_ALL_WIDTH){
        public void paint(Graphics graphics) {
            graphics.setBackgroundColor(0x00290008);
            graphics.setColor(Color.WHITE);
            graphics.clear();
            graphics.drawBitmap(0, 0, sha.getWidth(),
            sha.getHeight(), sha, 0, 0);
            super.paint(graphics);
        }
    };
    add(top);

    CustomListField4 list4 = new CustomListField4(null){
        protected boolean navigationClick(int status, int time) {
            getValue4();
            return true;
        }
    };
    fieldmanager.add(list4);
}

protected void getValue4() {
    Field f = getFieldWithFocus();
    if (f instanceof ListField) {
        ListField l = (ListField) f;
        final int index = l.getSelectedIndex();
        HistoryItem _contactslist = (HistoryItem) CustomListField4.val4.elementAt(index);
        final String id = _contactslist.getName();
        Dialog.alert(id+"");
    }
}

请帮我解决这个问题

编辑

class CustomListField4 extends ListField implements ListFieldCallback {

    public CustomListField4(Vector data) {
        super(0, ListField.MULTI_SELECT);
        final TableRowManager row = new TableRowManager() {
            public void paint(Graphics g) {
                // g.fillRect(0, 0, getWidth(), getHeight());
                g.setColor(0x0f3e19b);
                g.clear();
                super.paint(g);
            }
        };

        Bitmap icon = Bitmap.getBitmapResource("Devil Skype.png");
        HorizontalFieldManager h=new HorizontalFieldManager();
        h.add(new BitmapField(icon));
        //h.add(new BitmapField(song.getThumb()));
        h.add(new LabelField(song.getAlbumName()));
        //h.add(new LabelField(row1.getLanguage()));
        //h.setMargin(0,0,50,0);
        //Dialog.alert(song.getName());

        VerticalFieldManager vfm=new VerticalFieldManager();
        vfm.add(h);
        //vfm.add(new LabelField(song.getArtist()));
        row.add(vfm);
        contacts.addElement(row);
    }

    setSize( contacts.size());
}

// ListFieldCallback Implementation
public void drawListRow(ListField listField, Graphics g, int index, int y, int width) {
    listField.setRowHeight(index,107);
    CustomListField4 list = (CustomListField4) listField;
    TableRowManager rowManager = (TableRowManager) CustomListField4.contacts.elementAt(index);
    rowManager.drawRow(g, 0, y, width, list.getRowHeight());
}

public class TableRowManager extends Manager {
    public TableRowManager() {
        super(0);
    }   
4

3 回答 3

1

您正在调用 getFieldWithFocus() 这将为您提供经理。你需要得到叶子字段

protected void getValue4() {
   Field f = getLeafFieldWithFocus();
   if (f instanceof ListField) {
       //Your code
   }
}
于 2013-05-07T06:22:23.867 回答
0

我认为您的对象层次结构FieldManager正确,这会导致您检测字段焦点/选择时出现问题。

从您发布的原始代码中并不明显,但通过查看您的更新,我假设您为每一行fetchAlbumsForLetter()调用一次。那是不对的。

fetchAlbumsForLetter()CustomListField4每次调用时都会创建一个新的。并且,CustomListField4是一个ListField.

AListField并不意味着只代表一行。它旨在代表所有行。您应该只创建一个CustomListField4.

我会做以下两件事之一:

1.继续使用ListField

如果你想CustomListField4成为ListField( extends ListField),那么在你的实现中

public void drawListRow(ListField listField, Graphics g, int index, int y, int width);

您应该使用所有方法实际绘制图形对象Graphics#draw。这些是原始图形项目,如填充区域、线条、文本或位图。您不会在每个 ListField row 中使用 Field 对象,因为您正在尝试使用您的TableRowManager类。

请参阅此处获取示例 ListField,或查看此处获取更复杂的示例

2.用经理模仿ListField

将您的代码更改为

public class CustomListField4 extends VerticalFieldManager {

或者

public class CustomListField4 extends Manager {

然后,您可以TableRowManager对每一行使用 a,并向其中添加LabelFieldBitmapField对象。

有关此示例,请参见此处


如果您解决了这些问题,那么我认为您覆盖的方式可以navigationClick()很好地检测行点击,并对选定的行执行某些操作。

于 2013-05-06T11:15:54.893 回答
-1

你可以试试这个

 UiApplication.getUiApplication().invokeLater(new Runnable() {
                public void run() {
                    Dialog.alert(id+"");
                }
            });
于 2013-05-06T09:53:32.953 回答