【问题标题】:How to Display and hide an image in ListField on click in BlackBerry如何在 BlackBerry 中单击时在 ListField 中显示和隐藏图像
【发布时间】:2013-10-08 05:30:26
【问题描述】:

我正在使用 ListFields。我需要自定义 ListField。我有这张照片( http://supportforums.blackberry.com/t5/Java-Development/custom-list-field/td-p/2618419) :

我使用CodeModuleManager 获取已安装应用程序的列表,现在我想在 ListField 中显示它,如上图所示。您可以看到黑色的锁定图片,我需要在点击时自定义该图片。

我的意思是,当我单击任何行时,我想从列表字段中单击的行中删除黑色锁定图片,当我再次单击同一行时,我想将该锁定图片插入该行。

我想我必须在点击时调用drawListRow() 方法或其他方法?当我单击列表时,黑色的锁定图像应该消失。当我再次点击列表时,它应该会再次出现。

这是我使用的屏幕代码:

public final class MyScreen extends MainScreen {

    CustomListField myListView;

    public MyScreen() {

        Bitmap listThumb = Bitmap.getBitmapResource("icon.png");
        String listTitle="Headline";
        String listDesc = "Mobile news feeds";
        String listDesc2 = " ";
        final Bitmap navBar = Bitmap.getBitmapResource("lock.png");
        Vector v = new Vector();
        for(int i=0; i<30; i++){
            v.addElement(new ListRander(listThumb, listTitle, listDesc,listDesc2, navBar));
        }
        //v.addElement(new ListRander(listThumb, listTitle, listDesc,listDesc2, navBar));

        myListView = new CustomListField(v){


            protected boolean trackwheelClick (int status, int time) {

                Dialog.alert(" You have selected :" + getSelectedIndex());

                return super.trackwheelClick(status, time);
            }
        }
        ;
        add(myListView);   


    }
}

行数据类:

package mypackage;

import net.rim.device.api.system.Bitmap;

public class ListRander {

    private Bitmap listThumb= null;
    private Bitmap navBar = null;
    private String listTitle=null;
    private String listDesc= null;
    private String listDesc2= null;

    public ListRander(Bitmap listThumb,String listTitle, String listDesc, String listDesc2, Bitmap navBar) {
        this.listDesc = listDesc;
        this.listDesc2 = listDesc2;
        this.listThumb = listThumb;
        this.listTitle = listTitle;
        this.navBar = navBar;
    }
    public Bitmap getListThumb() {
        return listThumb;
    }
    public void setListThumb(Bitmap listThumb) {
        this.listThumb = listThumb;
    }
    public Bitmap getNavBar() {
        return navBar;
    }
    public void setNavBar(Bitmap navBar) {
        this.navBar = navBar;
    }
    public String getListTitle() {
        return listTitle;
    }
    public void setListTitle(String listTitle) {
        this.listTitle = listTitle;
    }
    public String getListDesc() {
        return listDesc;
    }
    public void setListDesc(String listDesc) {
        this.listDesc = listDesc;
    }
    public String getListDesc2() {
        return listDesc2;
    }
    public void setListDesc2(String listDesc2) {
        this.listDesc2 = listDesc2;
    }
}

自定义列表字段:

package mypackage;

import java.util.Enumeration;
import java.util.Vector;

import net.rim.device.api.system.Bitmap;
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.XYRect;
import net.rim.device.api.ui.component.ListField;
import net.rim.device.api.ui.component.ListFieldCallback;

public class CustomListField extends ListField implements ListFieldCallback {

    private Vector _listData;
    private int _MAX_ROW_HEIGHT = 60;
    public CustomListField (Vector data) {

        _listData = data;
        setSize(_listData.size());
        setSearchable(true);
        setCallback(this);
        setRowHeight(_MAX_ROW_HEIGHT);

    }

    protected void drawFocus (Graphics graphics, boolean on) {

        XYRect rect = new XYRect();
        graphics.setGlobalAlpha(150);
        graphics.setColor(Color.BLUE);
        getFocusRect(rect);
        drawHighlightRegion(graphics,HIGHLIGHT_FOCUS,true,rect.x,rect.y,rect.width,rect.height);

    }

    public int moveFocus (int amount, int status, int time) {

        this.invalidate(this.getSelectedIndex());
        return super.moveFocus(amount, status, time);

    }

    public void onFocus (int direction) {

        super.onFocus(direction);

    }

    protected void onUnFocus () {

        this.invalidate(this.getSelectedIndex());

    }

    public void refresh () {

        this.getManager().invalidate();

    }

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

        ListRander listRander = (ListRander)_listData.elementAt(index);
        graphics.setGlobalAlpha(255);
        graphics.setFont(Font.getDefault().getFontFamily().getFont(Font.PLAIN, 24));
        final int margin =5;
        final Bitmap thumb= listRander.getListThumb();
        final String listHeading = listRander.getListTitle();
        final String listDesc= listRander.getListDesc();
        final String listDesc2= listRander.getListDesc2();
        final Bitmap nevBar = listRander.getNavBar();
        //list border
        graphics.setColor(Color.BLACK);
        graphics.drawRect(0, y, w, _MAX_ROW_HEIGHT);

        //thumbnail border & thumbnail image
        graphics.setColor(Color.BLACK);
        graphics.drawRoundRect(margin-2, y+margin-2,thumb.getWidth()+2, thumb.getHeight()+2, 5, 5);
        graphics.drawBitmap(margin, y+margin, thumb.getWidth(), thumb.getHeight(), thumb, 0, 0);

        //drawing texts
       // graphics.setFont(FontGroup.fontBold);
        graphics.drawText(listHeading, 2*margin+thumb.getWidth(), y+margin);
        graphics.setColor(Color.BLACK);

        // graphics.setFont(FontGroup.smallFont);
        graphics.drawText(listDesc, 2*margin+thumb.getWidth(), y+ margin+20);
        graphics.drawText(listDesc2, 2*margin+thumb.getWidth(), y+ margin+32);

        //draw navigation button
        final int navBarPosY = y+(_MAX_ROW_HEIGHT/2 - nevBar.getHeight()/2);
        final int navBarPosX = Graphics.getScreenWidth()- nevBar.getWidth()+ margin;
        graphics.drawBitmap(navBarPosX-10, navBarPosY, nevBar.getWidth(), nevBar.getHeight(), nevBar, 0 , 0);

    }

    public Object get(ListField listField, int index) {

        String rowString = (String) _listData.elementAt(index);
        return rowString;

    }

    public int indexOfList (ListField listField, String prefix, int start) {

        for (Enumeration e = _listData.elements(); e.hasMoreElements(); ) {

            String rowString = (String) e.nextElement();
            if (rowString.startsWith(prefix)) {

                return _listData.indexOf(rowString);

            }

        }

        return 0;

    }

    public int getPreferredWidth(ListField listField) {

        return 3 * listField.getRowHeight();

    }

}

【问题讨论】:

  • 当我点击列表时,黑色的锁定图像应该会消失。当我再次单击列表时,它应该再次出现。

标签: blackberry java-me


【解决方案1】:

要遵循您的代码有点困难,因为您的变量没有正确命名(例如 navBar 使用的 lock.png)。请尝试在未来稍微清理一下...您将能够获得更好的答案。

从您的代码中,我可以看到锁定图像是使用此代码在drawListRow() 中绘制的:

    final int navBarPosY = y+(_MAX_ROW_HEIGHT/2 - nevBar.getHeight()/2);
    final int navBarPosX = Graphics.getScreenWidth()- nevBar.getWidth()+ margin;
    graphics.drawBitmap(navBarPosX-10, navBarPosY, nevBar.getWidth(), nevBar.getHeight(), nevBar, 0 , 0);

因此,您只需要跟踪drawListRow() 可以检查的每一行的布尔值,以确定是否应该绘制锁。向ListRander 添加一个新的locked 属性,它代表一行:

public class ListRander {
   private boolean locked = true;  // defaults to "locked"
   public boolean isLocked() {
      return locked;
   }
   public void setLocked(boolean value) {
      locked = value;
   }

然后,您将单击处理程序代码更改为:

  myListView = new CustomListField(v){

     protected boolean navigationClick(int status, int time) {
        int index = getSelectedIndex();
        ListRander lr = (ListRander) get(this, index);
        lr.setLocked(!lr.isLocked());
        // force a repaint of this row
        invalidate(index);
        return true;   // event consumed
     }

     //protected boolean trackwheelClick (int status, int time) {
     //  keep this commented out, unless trackwheel devices need special logic
     //}
  };

这将需要更改您的 CustomListField#get(ListField, int) 方法,该方法通常会返回一行的完整数据对象:

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

最后,更改 drawListRow() 以使用这个新的布尔值:

     if (listRander.isLocked()) {
        // draw lock button
        final int navBarPosY = y+(_MAX_ROW_HEIGHT/2 - nevBar.getHeight()/2);
        final int navBarPosX = Display.getWidth() - nevBar.getWidth()+ margin;         
        graphics.drawBitmap(navBarPosX-10, navBarPosY, nevBar.getWidth(), nevBar.getHeight(), nevBar, 0 , 0);
     }

【讨论】:

  • 嗨,我已经按照您上面的建议更改了我的代码,但它不起作用。当我单击该行以消失锁定图标时,什么也没发生。我的要求是当我单击列表字段中的特定行时,黑色的锁定图像应该消失。当我再次单击列表中的同一行时,它应该再次出现。
  • @user12345,对不起,在我的代码中,navigationClick() 方法中存在剪切和粘贴错误。我已经在上面修复了。请复制新的navigationClick() 代码并重试。我确实在我的应用程序中测试了这段代码,它工作正常。但是,我不得不将小的 sn-ps 粘贴到我的答案中,我错过了一块:(
猜你喜欢
  • 1970-01-01
  • 2016-02-02
  • 2010-12-19
  • 1970-01-01
  • 2017-07-12
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多