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

5
我使用StickyGridHeaders库来创建类似于Snapfish的网格视图。这是我期望的布局:

enter image description here

当我点击标题视图上的按钮(红箭头)时,弹出一个窗口而不是复选框。问题是我的弹窗总是显示错误的位置。从调试窗口中,我可以看到它与粘性标题具有相同的位置,但我使用StickyGridHeadersGridView.setAreHeadersSticky(false);关闭了我的网格视图的粘性头部。
这是我的适配器头:
    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;
        }

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

如果你还没有解决这个问题……试着从被点击的View获取位置:而不是从viewHolder实例中获取。v.getLocationOnScreen(location); - myanimal
我尝试过了,但它仍然显示在gridview的顶部。因为该库尝试通过附加和分离视图将标题视图固定在顶部。 - ductran
2个回答

1

我知道你的意思,但我该如何解决这个问题? - ductran

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所说,它会导致在整个屏幕上获取错误的窗口。
现在我已经放弃了使用StickyGridHeaders,改用带有Header项和Gridview项的Listview。虽然这不是最好的方法,但它可以工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接