StickyGridHeader中的弹出窗口显示错误的位置

时间:2014-05-01 04:05:48

标签: android android-gridview

我使用StickyGridHeaders库来创建类似snapfish的Gridview。这是我的预期布局:

enter image description here

我在触摸标题视图(红色箭头)上的按钮而不是复选框时会显示一个弹出窗口。问题是我的弹出窗口总是显示错误的位置。在调试窗口中,我可以看到它具有与粘贴标题相同的位置,但我使用StickyGridHeadersGridView.setAreHeadersSticky(false);

关闭了gridview的粘性标题

这是我的适配器标题:

    public View getHeaderView(final int position, View convertView, ViewGroup parent) {
            final HeaderViewHolder viewHolder;
            if(convertView == null){
                convertView = inflater.inflate(R.layout.item_header_gallery, null);
                viewHolder = new HeaderViewHolder();
                viewHolder.tvImagePrice = (TextView) convertView.findViewById(R.id.tvImagePrice);
                viewHolder.btnTouch = (Button) convertView.findViewById(R.id.btnTouch);
                convertView.setTag(viewHolder);
            }else{
                viewHolder = (HeaderViewHolder) convertView.getTag();       
            }

            ImageGroup item = headers.get(position);    
            viewHolder.tvImagePrice.setText(item.getPriceString());

            viewHolder.btnTouch.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    int[] location      = new int[2];

                    viewHolder.btnTouch.getLocationOnScreen(location);
                    // location always is [905,59] for every header item
                    System.out.println("location = " + location[0] + "," + location[1]);

                    // show popup on this location:
                    mPopupWindow.showAtLocation(v, Gravity.NO_GRAVITY, location[0], location[1]);
                }
            });

            return convertView;
        }

如果我在子视图而不是标题中显示弹出窗口,则弹出窗口会正确显示。 有什么不对吗?

2 个答案:

答案 0 :(得分:1)

看起来您正在将窗口位置放在另一个窗口内,而不是整个屏幕上的位置。请查看此问题以获取更多详细信息:getLocationOnScreen() vs getLocationInWindow()

答案 1 :(得分:0)

看起来无法正确获取标题项位置,因为此库在StickyGridHeadersBaseAdapterWrapper中使用了附加和分离标题视图

HeaderFillerView v = getHeaderFillerView(adapterPosition.mHeader, convertView, parent);
View view = mDelegate.getHeaderView(adapterPosition.mHeader, (View)v.getTag(), parent);
mGridView.detachHeader((View) v.getTag());
v.setTag(view);
mGridView.attachHeader(view);
convertView = v;
mLastHeaderViewSeen = v;
v.forceLayout();

实际上,它通过反射调用了视图类的dispatchAttachedToWindowdispatchDetachedFromWindow。它导致整个屏幕上的窗口出错,nosacky说。
现在我退出并用L​​istview项目和Gridview项目替换Listview的StickyGridHeaders。这不是最佳方式,但它可以工作。