0

我有一个包含多个项目的列表字段。我想从列表中选择一项并拖放到列表中的另一项。将项目放在另一个项目上后,项目的位置应互换。(示例:- 如果我从列表中选择第一项并在拖放后将该项目拖放到列表中的第四项,则应更改这两项的项目位置应更改为第 4 位的第 1 项和第 1 位的第 4 项)

我不知道该怎么做。请帮我完成这个任务。

    public class ListScreen extends MainScreen implements ListFieldCallback {
    // private ObjectChoiceField choices;
    private int x, y;
    int start = 0 , end=0;
    private int startPos;
//  private int pos;
    private ObjectListField list;
    private Object[] listData = new Object[] { "Ram", "Sunny", "Ramit",
            "Vishal","Ravinder","Manoj","Ravi","Vikas","Santosh","Ravi","Deepak","Sharma","Nvn" };

    public ListScreen() {
        init();
    }

    private void init() {
        list = new ObjectListField(FOCUSABLE);
        list.setRowHeight(45);
        list.setCallback(this);
        list.set(listData);
        add(list);
    }

    public void drawListRow(ListField listField, Graphics graphics, int index,
            int y, int width) {
        graphics.drawText(listData[index].toString(), 25, y + 10);

    }

    public Object get(ListField listField, int index) {
        return listData[index];
    }

    public int getPreferredWidth(ListField listField) {
        return getPreferredWidth();
    }

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

    // protected boolean navigationMovement(int dx, int dy, int status, int
    // time) {
    //
    // return super.navigationMovement(dx, dy, status, time);
    // }

    protected boolean touchEvent(TouchEvent message) {
        int eventCode = message.getEvent();

        // Get the screen coordinates of the touch event
        int touchX = message.getX(1);
        int touchY = message.getY(1);
        if (eventCode == TouchEvent.CLICK) {


            calculateStart(touchY);
            // Dialog.alert("You clicked at (" + touchX + "," + touchY + ")");
        }

        if (eventCode == TouchEvent.MOVE) {

            x = touchX;
            y = touchY;

            invalidate();
        }
        if (eventCode == TouchEvent.UNCLICK) {
            int unClickx = message.getX(1);
            int unClicky = message.getY(1);
            System.out.println("unclick at:" + unClickx + "::::" + unClicky);
            calculatePosition(unClicky);
        }



        return true;
    }


    private void calculatePosition(int dy) {
        if (dy != 0) {

                end = dy / 45;
                System.out.println(start + ":::" + end);
                Object temp = listData[start];
                listData[start] = listData[end];
                listData[end] = temp;
                invalidate();

        }

    }
    private void calculateStart(int dy){
        if(dy!=0)
        start = dy/45;

    }
}
4

1 回答 1

3

[针对触摸和非触摸设备更新]:尝试以下代码;我在 Torch (9800)、Storm (9550)、Bold (9700) 上进行了测试:

import net.rim.device.api.system.Characters;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.TouchEvent;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.component.ListField;
import net.rim.device.api.ui.component.ListFieldCallback;
import net.rim.device.api.ui.component.ObjectListField;
import net.rim.device.api.ui.container.MainScreen;
import net.rim.device.api.ui.container.VerticalFieldManager;
import net.rim.device.api.ui.decor.BackgroundFactory;

public class ListTestScreen extends MainScreen {
    private VerticalFieldManager mainManager = new VerticalFieldManager();
    public ListTestScreen() {
        mainManager.add(new LabelField("My Title"));
        mainManager.add(new LabelField("My List:"));
        mainManager.add(new MyList());
        mainManager.add(new LabelField("Something else"));
        add(mainManager);
    }
}

class MyList extends VerticalFieldManager implements ListFieldCallback {
    private int  mouseDownY, mouseUpY;
    private static int rowHeight = 45;
    private int mouseDownRowIndex, mouseUpRowIndex;
    int firstSelectedRow=-1, secondSelectedRow=-1;
    private int touchX;
    private int touchY;
    private boolean showShadow = false;

    private ObjectListField list;
    private Object[] listData = new Object[] { "Ram", "Sunny", "Ramit",
            "Vishal","Ravinder","Manoj","Ravi","Vikas","Santosh","Ravi","Deepak","Sharma","Nvn" };

    public MyList() {
        init();
        setBackground(BackgroundFactory.createLinearGradientBackground(0x0FCFC0, 0x0CCCC0, 0x09C9C0, 0x01C1C0));
    }

    private void init() {
        list = new ObjectListField(FOCUSABLE);
        list.setRowHeight(rowHeight);
        list.setCallback(this);
        list.set(listData);
        add(list);
    }

    private void interchangeRows(int r1, int r2) {
        Object temp = listData[r1];
        listData[r1] = listData[r2];
        listData[r2] = temp;
        invalidate();
    }

    public void drawListRow(ListField listField, Graphics graphics, int index,
            int y, int width) {
        graphics.drawText(listData[index].toString(), 25, y + 10);

    }

    public Object get(ListField listField, int index) {
        return listData[index];
    }

    public int getPreferredWidth(ListField listField) {
        return getPreferredWidth();
    }

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

    public int indexOfRowAt(int posY) {
        int index =(int) Math.floor(posY / rowHeight * 1.0); 
        return index;
    }


    protected boolean keyChar(char ch, int status, int time) {
        if(ch==Characters.SPACE) {
            if(firstSelectedRow ==-1) {
                firstSelectedRow = list.getSelectedIndex();
                return true;
            } else {
                secondSelectedRow = list.getSelectedIndex();
                if(firstSelectedRow == secondSelectedRow) {
                    firstSelectedRow = secondSelectedRow = -1;
                    invalidate();
                    return true;
                } else {
                    interchangeRows(firstSelectedRow, secondSelectedRow);
                    firstSelectedRow = secondSelectedRow = -1;
                    return true;
                }
            }
        }
        return super.keyChar(ch, status, time);
    }

    protected void paint(Graphics graphics) {
        if(firstSelectedRow!=-1) {
            int x = 0, y = firstSelectedRow*rowHeight;
            int savedColor = graphics.getColor();
            int preAlpha = graphics.getGlobalAlpha();
            graphics.setGlobalAlpha(90) ;           
            graphics.setColor(0xFF22FF);

            graphics.fillRect(0, y, getWidth(), rowHeight);


            graphics.setColor(savedColor);
            graphics.setGlobalAlpha(preAlpha) ;
        }

        super.paint(graphics);

        if(showShadow && mouseDownRowIndex != -1) {
            int preAlpha = graphics.getGlobalAlpha();
            graphics.setGlobalAlpha(100) ;
            graphics.drawText(listData[mouseDownRowIndex].toString(), 25, touchY);
            graphics.setGlobalAlpha(preAlpha) ;
        }
    }

    protected boolean touchEvent(TouchEvent message) {
        int eventCode = message.getEvent();

        // Get the screen coordinates of the touch event
        touchX = message.getX(1);
        touchY = message.getY(1);       


        if(eventCode == TouchEvent.DOWN) {
            mouseDownY = touchY;
            mouseDownRowIndex = indexOfRowAt(mouseDownY);
            showShadow = true;
            invalidate();
            return true;
        }        
        else if(eventCode == TouchEvent.UP) {
            showShadow = false;
            mouseUpY = touchY;
            mouseUpRowIndex = indexOfRowAt(mouseUpY);
            if(mouseDownRowIndex != mouseUpRowIndex) {
                interchangeRows(mouseDownRowIndex, mouseUpRowIndex);
                mouseDownRowIndex = mouseUpRowIndex = -1;
                return true;
            }
            mouseDownRowIndex = mouseUpRowIndex = -1;
            invalidate();
        } else if(eventCode == TouchEvent.MOVE) {
            invalidate();
            return true;
        }
        return super.touchEvent(message);
    }
}

[编辑: ]

对于支持触摸的设备:第一个选定项目的文本阴影随光标移动。

对于非触摸设备:我使用空格键来选择要交换的项目。选择一个项目,按空格键,选择第二个项目,再次按空格键,项目互换!!在已选择的项目上按空格键将取消选择该项目。

让我知道它是否有效。

列表字段自定义的进一步增强已在StackOverflow 答案中发布。

于 2012-04-16T16:15:52.607 回答