Get absolute position representation in ListView

I am trying to create a popup above / below an element that is clicked inside a ListView. However, the problem is that the view included in the OnItemClick method gives me only the X and Y values ​​relative to the ListView itself. I also checked the ListView, and that also gives me x = 0 y = 0, despite the fact that there are other views above it.

I looked through all the values ​​in a hierarchical view, but did not see the values ​​that I was looking for. (And it’s not for me that I have serious problems with having it work again).

Any tips?

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

Both items in the list make a popup in the same place. Popup Not Appearing In desired positions

+6
source share
3 answers

This should work

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

The location array must have the x and y values ​​of the view. 'v' is the view object passed to onItemClickListener.

I add some parts that I used for my project. This may be helpful. I had an action bar at the top of the list, and this code worked fine.

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

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

In this class PopupHelper 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); } } 
+8
source

for those who stick to this problem try using this piece of code

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

hope this help.

+1
source

Try this and see if it works.

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

}

// here listItem.getMeasuredHeight () will get u the height of each list item ... U can get ur y position in height * clickedPosition

0
source

Source: https://habr.com/ru/post/921212/


All Articles