2012-07-24 5 views
6

J'essaie de faire apparaître une fenêtre contextuelle au-dessus ou au-dessous d'un élément qui est cliqué à l'intérieur d'un ListView. Toutefois, le problème est que la vue qui provient de la méthode OnItemClick ne me donne que ses valeurs X & Y par rapport à la ListView elle-même. J'ai aussi vérifié le ListView et cela me donne aussi x = 0 y = 0 en dépit du fait qu'il y a d'autres vues dessus. J'ai parcouru toutes les valeurs dans hierarchyviewer, mais je n'ai pas vu les valeurs que je recherchais. (Et je n'ai pas de gros problèmes pour le faire fonctionner à nouveau).Obtenir la position d'affichage absolue dans ListView

Un conseil?

@Override 
public void onListItemClick(ListView listView, View view, int position, long id) { 
    LayoutInflater inflater = getLayoutInflater(null); 
    PopupWindow quickRail = new PopupWindow(
      inflater.inflate(R.layout.quanitity_controls, null), view.getMeasuredWidth(), 
      view.getMeasuredHeight()); 

    int[] location = { 
      0, 0 
    }; 

    // This doesn't place this window right on top of the view 
    quickRail.showAtLocation(view, Gravity.CENTER, 0, location[1]); 
} 

Les deux éléments de la liste font apparaître le Popup au même endroit. Popup Not Appearing In desired positions

Répondre

8

Cela devrait fonctionner

//Activity windows height 
int totalHeight = getWindowManager().getDefaultDisplay().getHeight(); 
int[] location = new int[2]; 
v.getLocationOnScreen(location); 

Le tableau d'emplacement doit avoir les valeurs x et y de la vue. 'v' est l'objet de vue transmis à onItemClickListener.

J'ajoute quelques parties que j'ai utilisées pour mon projet. Cela pourrait être utile. J'avais une barre d'action en haut de la liste et ce code semblait fonctionner correctement.

L'exigence était d'apporter un petit menu soit en haut ou en dessous d'un élément de la liste. Donc, quand un élément est sélectionné, je vérifie si l'élément de liste sélectionné est dans la moitié supérieure de l'écran, si c'est le cas, placez le menu sous l'élément de la liste sinon placez-le au-dessus de l'élément de liste. est ici le code

ListItem cliquez sur le code

listView.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View view, int position 
      , long id) { 
     showQuickActionMenu(position,view); 
    } 
}); 

private void showQuickActionMenu(int pos, View v){ 
    LayoutInflater inflater = 
      (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    //This is just a view with buttons that act as a menu. 
    View popupView = inflater.inflate(R.layout.ticket_list_menu, null); 
    popupView.findViewById(R.id.menu_view).setTag(pos); 
    popupView.findViewById(R.id.menu_change_status).setTag(pos); 
    popupView.findViewById(R.id.menu_add_note).setTag(pos); 
    popupView.findViewById(R.id.menu_add_attachment).setTag(pos); 

    window = PopupHelper.newBasicPopupWindow(TicketList.this); 
    window.setContentView(popupView); 
    int totalHeight = getWindowManager().getDefaultDisplay().getHeight(); 
    int[] location = new int[2]; 
    v.getLocationOnScreen(location); 

    if (location[1] < (totalHeight/2.0)) { 
     PopupHelper.showLikeQuickAction(window, popupView, v 
       , getWindowManager(),0,0,PopupHelper.UPPER_HALF); 
    } else { 
     PopupHelper.showLikeQuickAction(window, popupView, v 
       , getWindowManager(),0, 0,PopupHelper.LOWER_HALF); 
    } 
} 

Cette classe de PopupHelper J'utilise

public class PopupHelper { 
    public static final int UPPER_HALF = 0; 
    public static final int LOWER_HALF = 1; 

    public static PopupWindow newBasicPopupWindow(Context context) { 
     final PopupWindow window = new PopupWindow(context); 

     // when a touch even happens outside of the window 
     // make the window go away 
     window.setTouchInterceptor(new OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       if(event.getAction() == MotionEvent.ACTION_OUTSIDE) { 
        window.dismiss(); 
        return true; 
       } 
       return false; 
      } 
     }); 

     window.setWidth(WindowManager.LayoutParams.WRAP_CONTENT); 
     window.setHeight(WindowManager.LayoutParams.WRAP_CONTENT); 
     window.setTouchable(true); 
     window.setFocusable(true); 
     window.setOutsideTouchable(true); 

     window.setBackgroundDrawable(
       new ColorDrawable(android.R.color.darker_gray));   
     return window; 
    } 

    /** 
    * Displays like a QuickAction from the anchor view. 
    * 
    * @param xOffset 
    *   offset in the X direction 
    * @param yOffset 
    *   offset in the Y direction 
    */ 
    public static void showLikeQuickAction(PopupWindow window, View root, 
      View anchor, WindowManager windowManager, int xOffset 
      ,int yOffset,int section) { 

     //window.setAnimationStyle(R.style.Animations_GrowFromBottomRight); 

     int[] location = new int[2]; 
     anchor.getLocationOnScreen(location); 

     Rect anchorRect = new Rect(location[0], location[1], location[0] + 
       anchor.getWidth(), location[1] + anchor.getHeight()); 

     root.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 

     int rootWidth = root.getMeasuredWidth(); 
     int rootHeight = root.getMeasuredHeight(); 

     int screenWidth = windowManager.getDefaultDisplay().getWidth(); 
     int screenHeight = windowManager.getDefaultDisplay().getHeight(); 

     int xPos = ((screenWidth - rootWidth)/2) + xOffset; 
     int yPos = anchorRect.top - rootHeight + yOffset; 

     xPos = (screenWidth - rootWidth); 
     if(section == UPPER_HALF){ 
      yPos = anchorRect.top + anchor.getMeasuredHeight();  
     } else { 
      yPos = anchorRect.top - rootHeight; 
     } 
     window.showAtLocation(anchor, Gravity.NO_GRAVITY, xPos, yPos); 
    } 

} 
+0

Merci pour cela, mais j'ai essayé cela et cela me donne seulement la position relative. Donc, le premier élément est la liste est 0,0. C'est proche, parce que je pensais que c'était aussi la solution. Je crois que j'ai des problèmes de traduction quelque part. –

+0

pouvez-vous mettre votre mise en page xml. J'avais un peu la même exigence mais ma mise en page n'avait qu'une listview. – blessenm

+0

J'ai mis à jour ma réponse. – blessenm

0

Essayez et voir si cela fonctionne ..

private void setListViewHeightBasedOnChildren(ListView listView) { 
    ListAdapter listAdapter = listView.getAdapter(); 
    if (listAdapter == null) { 
     // pre-condition 
     return; 
    } 
    int totalHeight = 0; 
    int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST); 
    for (int i = 0; i < listAdapter.getCount(); i++) { 
     View listItem = listAdapter.getView(i, null, listView); 
     listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED); 
     totalHeight += listItem.getMeasuredHeight(); 
    } 

}

// ici listItem.getMeasuredHeight() va obtenir u la hauteur de chaque élément de la liste ... U peut obtenir ur position y par la hauteur * clickedPosition

+0

Merci pour la réponse. Je n'ai aucun problème pour obtenir la hauteur de la liste. J'essaie d'obtenir les coordonnées de l'écran d'une vue afin que je puisse montrer un PopupWindow juste à côté. –

1

pour ceux qui collent à ce sujet utilisation try cet extrait de code

popWindow.showAsDropDown(v);//v is your listview or recyclerview item Element that clicked. 

espérons que cette aide.