2012-04-16 1 views
0

У меня есть поле списка с несколькими элементами. Я хочу выбрать один элемент из списка и перетащить его на другой элемент в списке. После сброса позиции на другой предмет позиция предметов должна быть заменена. (Пример: - если я выбираю 1-й элемент из списка и перетаскиваю этот пункт в 4-й пункт в списке после падения, позиция позиции обоих предметов должна быть изменена. 1-й пункт в 4-й позиции и 4-й позиции в 1-й позиции)Как перетащить элемент из списка в другой элемент в списке и заменить их позиции

Я не знаю, как это сделать. Пожалуйста, помогите мне выполнить эту задачу.

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; 

    } 
} 
+0

Вам нужно объяснить свой вопрос. И название не имеет никакого отношения к вопросу (трудно выяснить отношение, если существует). – Rupak

+0

Я редактировал мой Q Rupak. – cyberlinks

+0

Я думаю, что это сложная задача в BlackBerry. Для этого нам может понадобиться использовать некоторый менеджер «VerticalFieldManager» вместо настраиваемого «ListField». И после определения действия перетаскивания нам нужно войти в режим анимации, а в отношении движения касания (движение мыши) нам нужно нарисовать выделенный элемент из «VerticalFieldManager» в новом положении. – Rupak

ответ

3

[обновлялось ОБА потрогать и устройства без сенсорного экрана]: Попробуйте следующий код; Я тестировал на факеле (9800), Storm (9550), полужирный (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); 
    } 
} 

[Редакция:]

Для сенсорных поддерживаемых устройств: тень текста первый выбранный элемент перемещается вместе с курсором.

Для несенсорных устройств: Я использовал ПРОБЕЛ для выбора элементов для обмена. Выберите элемент, нажмите ПРОБЕЛ, выберите второй элемент, нажмите ПРОБЕЛ снова, предметы заменены! Нажатие SPACEBAR на уже выбранном элементе отменит выбор этого элемента.

Сообщите мне, работает ли он или нет.

Дальнейшее расширение списка поля настройки были размещены в это StackOverflow Answer.

+0

НЕТ его не работает отлично. Когда я прокручиваю экран по вертикали после что он не работает нормально – cyberlinks

+0

** Попробуйте сейчас **, я изменил код: теперь класс 'MyList' расширяет' VerticalFieldManager', а не 'MainScreen'. Проблема с прокруткой решена. Теперь вы можете использовать' MyList' в любой позиции, которую вы хотите. –

+0

Мой код просто для того, чтобы дать вам представление о том, как это можно сделать ... вам нужно сделать все остальное. –