2014-11-19 5 views
0

Я пытаюсь вывести информационное окно на маркер на основе элемента, выбранного из списка. Таким образом, в основном, когда был выбран пункт ListView, он будет выполнять createCallOutView():Android ListView Item Selected Event

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View item, 
       int position, long id) { 

      float x = Float.parseFloat(_eventlist.get(position).getEventX()); 
      float y = Float.parseFloat(_eventlist.get(position).getEventY()); 

      ENeighbourhoodActivity.callout.hide(); 
      int[] graphicIDs = ENeighbourhoodActivity.graphicsLayer.getGraphicIDs(x, y, 25); 
      if (graphicIDs != null && graphicIDs.length > 0) { 
       Graphic gr = ENeighbourhoodActivity.graphicsLayer.getGraphic(graphicIDs[0]); 
       Point location = (Point) gr.getGeometry(); 
       ENeighbourhoodActivity.callout.setOffset(0, -10); 
       ENeighbourhoodActivity.callout.show(location, EventInfoWindow.createCalloutView(
         gr, context, userID)); 
      } 
      getActivity().finish(); 

     } 
    }); 

И в моем createCallOutView(), это только в основном отображение отображения сведений о событиях. Однако с этими кодами, когда был выбран элемент listview, экран просто зависает, и через некоторое время он просто показывает, что приложение не отвечает и закрывает действие.

Любые идеи? Сообщения об ошибках отсутствуют. Заранее спасибо.

ответ

1

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

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View item, 
      int position, long id) { 
     new Thread(new Runnable() { 
     @Override 
     public void run() { 
      float x = Float.parseFloat(_eventlist.get(position).getEventX()); 
      float y = Float.parseFloat(_eventlist.get(position).getEventY()); 

      ENeighbourhoodActivity.callout.hide(); 
      int[] graphicIDs = ENeighbourhoodActivity.graphicsLayer.getGraphicIDs(x, y, 25); 
     if (graphicIDs != null && graphicIDs.length > 0) { 
      Graphic gr = ENeighbourhoodActivity.graphicsLayer.getGraphic(graphicIDs[0]); 
      Point location = (Point) gr.getGeometry(); 
      ENeighbourhoodActivity.callout.setOffset(0, -10); 
      ENeighbourhoodActivity.callout.show(location, EventInfoWindow.createCalloutView(
        gr, context, userID)); 

     } 
     getActivity().finish(); 
     } 
     }).start(); 


    } 
}); 

Не забудьте использовать runOnUiThread, когда вы хотите обновить пользовательский интерфейс

+0

Но я получил ошибку синтаксиса, неуместны конструкцию на новую нить там. А как насчет runOnUiThread? –

+0

Отредактировано ответ попробовать – John

+0

Но он не отображает информационное окно, которое должно быть там, когда я вызываю createCallOutView(). Он просто закрывает активность :( –