Get Absolute View Position in ListView

后端 未结 3 1653
[愿得一人]
[愿得一人] 2021-02-09 14:29

I am trying to make a popup window appear above/below an item that is clicked inside of a ListView. However, the problem is that the View that is coming in from the OnItemClick

3条回答
  •  你的背包
    2021-02-09 14:57

    This should work

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

    The location array should have the x and y values of the view. 'v' is the view object passed on the onItemClickListener.

    Im adding some parts I used for my project. It might be helpful. I had an actionbar on the top of the listview and this code seemed to work fine.

    The requirement was to bring a small menu either on top or below a list item. So when an item is selected, I check if the selected list item is in the upper half of the screen, if so put the menu below the list item otherwise put it on top of the list item. Here's the code

    ListItem click 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);
        }   
    }
    

    This the PopupHelper class I use

    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);
        }
    
    }
    

提交回复
热议问题